下面是关于一个 Client 和 Server 的一个非常简单的程序,要达到的目的就是通过把几个数从Client传到Server,然后Server又把一些数传给Client。但结果是Server能够得到Client传来的数,可是Server不能把数传给Client。请问大家,问题出在什么地方?
另外,这样的传输问题,一定要用到线程吗? 非常感谢!
[code="java"]
import java.io.*;
import java.net.*;
public class ClientTest {
public static void main(String[] args) throws IOException {
Socket clientSocket = new Socket(InetAddress.getLocalHost()
.getHostAddress(), 8887);
System.out.print(InetAddress.getLocalHost().getHostAddress());
DataOutputStream outToServer = new DataOutputStream(
new BufferedOutputStream(clientSocket.getOutputStream()));
outToServer.writeInt(123);
DataInputStream inFromServer = new DataInputStream(new BufferedInputStream(
clientSocket.getInputStream()));
System.out.println("From Server: " + inFromServer.readInt());
outToServer.flush();
outToServer.close();
inFromServer.close();
clientSocket.close();
}
}
[/code]
[code="java"]
import java.io.*;
import java.net.*;
public class ServerTest {
public static void main(String[] args) throws IOException {
ServerSocket welcomeSocket = new ServerSocket(8887);
System.out.println("Warten auf Client ...");
Socket connectionSocket = welcomeSocket.accept();
DataInputStream inFromClient = new DataInputStream(new BufferedInputStream(
connectionSocket.getInputStream()));
System.out.println("From Cleint: " + inFromClient.readInt());
DataOutputStream outToClient = new DataOutputStream(
new BufferedOutputStream(connectionSocket.getOutputStream()));
outToClient.writeInt(234);
System.out.println("Daten wurden vom Server gesendet!");
inFromClient.close();
outToClient.flush();
outToClient.close();
connectionSocket.close();
welcomeSocket.close();
}
}
[/code]
[quote]import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
public class ClientTest
{
public static void main(String[] args) throws IOException
{
Socket clientSocket = new Socket(InetAddress.getLocalHost().getHostAddress(), 8887);
System.out.print(InetAddress.getLocalHost().getHostAddress());
DataOutputStream outToServer = new DataOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
outToServer.writeInt(123);
[color=red] outToServer.flush();[/color]
System.out.print("数据发送完毕....");
DataInputStream inFromServer = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
System.out.println("From Server: " + inFromServer.readInt());
outToServer.flush();
outToServer.close();
inFromServer.close();
clientSocket.close();
}
}[/quote]
[quote]import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerTest
{
public static void main(String[] args) throws IOException
{
ServerSocket welcomeSocket = new ServerSocket(8887);
System.out.println("Warten auf Client ...");
Socket connectionSocket = welcomeSocket.accept();
DataInputStream inFromClient = new DataInputStream(new BufferedInputStream(connectionSocket.getInputStream()));
System.out.println("From Cleint: " + inFromClient.readInt());
DataOutputStream outToClient = new DataOutputStream(
new BufferedOutputStream(connectionSocket.getOutputStream()));
outToClient.writeInt(234);
[color=red]outToClient.flush();[/color]
System.out.println("Daten wurden vom Server gesendet!");
inFromClient.close();
outToClient.flush();
outToClient.close();
connectionSocket.close();
welcomeSocket.close();
}
}[/quote]
代码如上,稍微修改了一下,红色为修改的部分
可以从论坛搜一下socket方面的例子参考一下哦
这个也不一定非要用线程,看实际的应用,用线程的目的是为了并发考虑的
InputStream在read的时候,都是即时读取的,执行完马上就执行IO操作并返回数据。 而OutputStream为了提高效率都不是即时输出的,write会把数据先写到缓存里面,积累够了再一次性做IO输出,所以你虽然write了,但数据还没传出去,flush方法就是强制对buffer里面的内容做IO输出。
恩 就是写了,没有flush()。
两个客户端应该既是服务器又是客户端,
也就是在客户端增加服务器代码,
在服务器端增加客户端代码就了~~