读书人

基于TCP协议的Socket通信的一个有关问

发布时间: 2012-11-06 14:07:00 作者: rapoo

基于TCP协议的Socket通信的一个问题---急
学习Socket通信,基于TCP协议编写了一个服务器端和客户端程序,
目的就是服务器端和客户端分别输出对方发来的字符串。
代码分别如下:

import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

public class Server {

public static void main(String args[]) throws IOException,SocketException
{
ServerSocket server=new ServerSocket(8000);
System.out.println("服务器已经启动......");
Socket s=server.accept();
InputStream in=s.getInputStream();

BufferedReader br=new BufferedReader(new InputStreamReader(in));
System.out.println(br.readLine());

OutputStream out=s.getOutputStream();
out.write("welcome to visit Server".getBytes());
out.flush();

br.close();
s.close();
server.close();
}

}

客户端代码如下:
import java.io.*;
import java.net.*;

public class Client {

public static void main(String args[]) throws IOException,SocketException
{
Socket client=new Socket("127.0.0.1",8000);

OutputStream out=client.getOutputStream();
out.write("hello Server".getBytes());
out.flush();

InputStream in=client.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));

System.out.println(br.readLine());

out.close();
br.close();
client.close();
}

}

在命令提示符窗口中先启动服务器端程序,然后在另一窗口中启动客户端程序,
运行的结果是两段都处于阻塞状态了,没有输出对方发来的字符串,请问原因是什么,程序如何修改?
请高手指点,,,,谢谢了 急盼回复。。。。。。。。。。。

[解决办法]
客户端在发送信息时,把回车换行符也加上

Java code
  OutputStream out=client.getOutputStream();  out.write("hello Server\r\n".getBytes());  out.flush();
[解决办法]
两个程序BufferedReader br=new BufferedReader(new InputStreamReader(in));
改为BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
in为类System的常量。
由于两个程序没有采用循环,因此服务器可接受到hello Server,客户机可接受到welcome to visit Server各一次OK!
[解决办法]
ReadLine的特性:只有读到换行符才算读到一次数据,所以你的Server会堵塞,因为一直读不到换行。所以你要在字符串后加换行符。即
out.write("welcome to visit Server\n".getBytes());
out.write("hello Server\n".getBytes());

读书人网 >J2SE开发

热点推荐