首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

请问一个java socket的有关问题,为何server端读不到client端发送过来的消息,有什么办法可以解决

2013-01-22 
请教一个java socket的问题,为何server端读不到client端发送过来的消息,有什么办法可以解决server端:publi

请教一个java socket的问题,为何server端读不到client端发送过来的消息,有什么办法可以解决
server端:
public class IS {

ServerSocket server = null;
Socket client = null;

public static void main(String[] args) {
new IS().sendAndRecv();
}

public void sendAndRecv() {
try {
server = new ServerSocket(8003);
while (true) {
client = server.accept();
OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();
int size = is.available();
byte[] a = new byte[size];
is.read(a);
String strque = new String(a);
System.out.println(strque);
os.write("lisi he zhangsan ye!".getBytes());
os.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
client端:
public class IC {
Socket client = null;

public static void main(String[] args) {
new IC().sendAndRecv();
}

public void sendAndRecv() {
try {
client = new Socket("127.0.0.1", 8003);
OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();
os.write("zhangsan he li si is firend".getBytes());
os.flush();
int size = is.available();
byte[] a = new byte[size];
is.read(a);
String strque = new String(a);
System.out.println(strque);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} socket问题 socket
[解决办法]
客户端读的时候需要等待一段时间才会有值的,


public class Server {
ServerSocket server = null;
Socket client = null;

public static void main(String[] args) {
new Server().sendAndRecv();
}

public void sendAndRecv() {
try {
server = new ServerSocket(8003);
while (true) {
client = server.accept();
System.out.println(client.getInetAddress() + "已连接......");
OutputStream os = client.getOutputStream();
InputStream is = client.getInputStream();
int i = -1;
byte[] buf = new byte[1024];
i = is.read(buf);
System.out.println(new String(buf, 0, i));
System.out.println("信息已经读取完成.");
os.write("hello world!".getBytes());
os.flush();
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Client {
Socket client = null;

public static void main(String[] args) {
new Client().sendAndRecv();
}

public void sendAndRecv() {
try {
client = new Socket("127.0.0.1", 8003);


OutputStream os = client.getOutputStream();
os.write("zhangsan he li si is firend".getBytes());
os.flush();
int i = -1;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
InputStream is = client.getInputStream();
byte[] buf = new byte[is.available()];
i = is.read(buf);
System.out.println(new String(buf, 0, i));
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


[解决办法]
看来你对Socket的通信原理还不够了解。
先说说你这个例子,其实你这个例子单回合是没有问题的,也就是Client第一次给Server发信息,Server是可以收到的,但是第二次它就收不到了,因为阻塞了。

要解决这个问题,就是要收、发分离,不管是服务端还是客户端,都有两个线程(一个负责收的Socket,一个负责发的Socket),而不是像你现在这样在一个线程里用同一个Socket来处理收发(read是会阻塞的,说白了阻塞后,程序就停在那了,不会往下执行)。
[解决办法]
你server端的流顺序写反了。你server端和client都是先开输出流,两个人都抢着要先说话,怎么能接收呢。
你要让client端先说话,server端先接收。那么就要在server端先开输入流,让其处于阻塞状态,先去接收client端的信息。
InputStream is = client.getInputStream();
OutputStream os = client.getOutputStream();
就是把server端开流的这个顺序改成这样

[解决办法]
楼上讲的好! 
单纯楼主的代码,size读到的是 0。可以让等待,直到不为零。
服务器端和客户端,在size=is.available()后,加上:
while(size==0)
{
size=is.available();
}

一直等到有数据。

热点排行