这两天在搞使用Socket类,TCP  但是即使照搬书上的例子,连简单的Server端和Client端的相互应对都 没反应,实在是找不出原因,举个例子:
服务器端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;public class Server {
public static void main(String args[]) {
try {
ServerSocket ss = new ServerSocket(7777);
System.out.println("服务器端在7777端口监听……");
Socket s = ss.accept();
System.out.println("已有客户端连接过来,开始进行通信……");
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String str = br.readLine();
System.out.println("=============下面是客户端发送来的消息================");
System.out.println(str);
PrintWriter pw = new PrintWriter(out);
System.out.println("正在向客户端发送消息……");
pw.write("客户端你好,这里是服务器端……");
pw.flush();
System.out.println("想客户端发送消息完成。");

br.close();
pw.close();
ss.close();
s.close();
}catch (UnknownHostException e) {
System.out.println("无法找到相应的机器,错误信息。"+e.getMessage());
}catch (IOException e) {
System.out.println("数据传输出现错误:"+e.getMessage());
}
}
}客户端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class Client {
public static void main(String args[]) {
byte[] addr = new byte[] {127,0,0,1};
try {
InetAddress local = InetAddress.getByAddress(addr);
Socket s = new Socket(local,7777);
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
System.out.println("正在向服务器端发送消息……");
PrintWriter pw = new PrintWriter(out);
pw.write("服务器端你好,这里是客户端……");
//pw.flush();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String str1 = br.readLine();
System.out.println("========下面是服务器端发来的消息======== ");
System.out.println(str1);
System.out.println("===================");

pw.close();
br.close();
s.close();
System.out.println("向服务器端发送消息揭示。");
}catch (UnknownHostException e) {
System.out.println("无法找到相应的机器,错误信息。"+e.getMessage());
}catch (IOException e) {
System.out.println("数据传输出现错误:"+e.getMessage());
}
}
}运行结果就死这里了:
socket

解决方案 »

  1.   

    我改了如下两个地方,仅供参考啊,
    因为你的服务器端读数据时使用的readLine(),所以在客户端向服务器端写入数据时要显示的写入一个回车换行:“\r\n”。
    pw.write("服务器端你好,这里是客户端……\r\n");
     pw.flush();
    所以不建议你用现在这样的IO处理方式,试试用别的IO处理方式试试吧。
    修改过后可以正常通信,
    Server:
    服务器端在7777端口监听……
    已有客户端连接过来,开始进行通信……
    =============下面是客户端发送来的消息================
    服务器端你好,这里是客户端……
    正在向客户端发送消息……
    想客户端发送消息完成。
    Client:
    正在向服务器端发送消息……
    ========下面是服务器端发来的消息======== 
    客户端你好,这里是服务器端……
    ===================
    向服务器端发送消息揭示。
      

  2.   


    首先表示感谢
    试验了一下确实可以,没想到redaLine()方法还有这个要求,\r , \n ,  \n\r  都可以,不过为什么服务器端也用pw.write()方法,就不要注意回车换行了呢?还有使用DataInputStream  的readUTF()方法好像可以替换。
      

  3.   

    readLine()就是读取一行,而\r\n就是回车换行符。服务器端用不用pw.write(),自己可以选择。DataInputStream是字节的方式读取,readUTF()是把字节按照UTF-8的方式对字节进行编码。好好看看Java IO的部分吧,刚开始可能会有点乱,多看点就能系统了。
      

  4.   


    我的意思是服务器端用pw.write()方法,可以不加\r\n,客户端也可以输出结果。而客户端的pw.write()方法为什么必须要加\r\n呢?
      

  5.   


    刚才写错了,我的意思是服务器端的pw.write()方法,为什么可以省略\r\n,而客户端也是使用的readLine()方法,结果就没问题?
      

  6.   

    readLine() 是阻塞时方法!!!!
      

  7.   


    刚才写错了,我的意思是服务器端的pw.write()方法,为什么可以省略\r\n,而客户端也是使用的readLine()方法,结果就没问题?
    我的解释是:服务器端发送完数据后,关闭输入输出流和Socket连接,清空缓存,客户端的readLine正在阻塞的等待“\r”或“\n”,当发现连接断开时,阻塞结束,继续执行下面的语句,所以客户端正常显示了。(仅供参考)
    你可以做一个测试:
    一)服务器端代码改为如下形式:
    System.out.println("=============下面是客户端发送来的消息================");
    System.out.println(str);
    PrintWriter pw = new PrintWriter(out);
    System.out.println("正在向客户端发送消息……");
    pw.write("客户端你好,这里是服务器端……");
    pw.flush();
    System.out.println("向客户端发送消息完成。");

    String str1 = br.readLine();
    System.out.println(str1);

    br.close();
    pw.close();
    ss.close();
    s.close();
    客户端不变。运行一下试试,发现客户端不能正常显示了。二)然后在修改服务器端代码:
    PrintWriter pw = new PrintWriter(out);
    System.out.println("正在向客户端发送消息……");
    pw.write("客户端你好,这里是服务器端……\r");
    pw.flush();
    只是加上了“\r”而已,现在客户端又恢复正常显示了。
      

  8.   


    刚才写错了,我的意思是服务器端的pw.write()方法,为什么可以省略\r\n,而客户端也是使用的readLine()方法,结果就没问题?
    我的解释是:服务器端发送完数据后,关闭输入输出流和Socket连接,清空缓存,客户端的readLine正在阻塞的等待“\r”或“\n”,当发现连接断开时,阻塞结束,继续执行下面的语句,所以客户端正常显示了。(仅供参考)
    你可以做一个测试:
    一)服务器端代码改为如下形式:
    System.out.println("=============下面是客户端发送来的消息================");
    System.out.println(str);
    PrintWriter pw = new PrintWriter(out);
    System.out.println("正在向客户端发送消息……");
    pw.write("客户端你好,这里是服务器端……");
    pw.flush();
    System.out.println("向客户端发送消息完成。");

    String str1 = br.readLine();
    System.out.println(str1);

    br.close();
    pw.close();
    ss.close();
    s.close();
    客户端不变。运行一下试试,发现客户端不能正常显示了。二)然后在修改服务器端代码:
    PrintWriter pw = new PrintWriter(out);
    System.out.println("正在向客户端发送消息……");
    pw.write("客户端你好,这里是服务器端……\r");
    pw.flush();
    只是加上了“\r”而已,现在客户端又恢复正常显示了。真按你理解的方式说,好像也对,客户端之所以可以正常,还是因为服务器端结束了,客户端readLine其实还是接受到了\r或者\n的。