当前位置: 代码迷 >> J2SE >> 基于TCP协议的Socket通信的一个有关问题-
  详细解决方案

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

热度:2546   发布时间:2013-02-25 00:00:00.0
基于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());
  相关解决方案