这两天在搞使用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
服务器端:
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
因为你的服务器端读数据时使用的readLine(),所以在客户端向服务器端写入数据时要显示的写入一个回车换行:“\r\n”。
pw.write("服务器端你好,这里是客户端……\r\n");
pw.flush();
所以不建议你用现在这样的IO处理方式,试试用别的IO处理方式试试吧。
修改过后可以正常通信,
Server:
服务器端在7777端口监听……
已有客户端连接过来,开始进行通信……
=============下面是客户端发送来的消息================
服务器端你好,这里是客户端……
正在向客户端发送消息……
想客户端发送消息完成。
Client:
正在向服务器端发送消息……
========下面是服务器端发来的消息========
客户端你好,这里是服务器端……
===================
向服务器端发送消息揭示。
首先表示感谢
试验了一下确实可以,没想到redaLine()方法还有这个要求,\r , \n , \n\r 都可以,不过为什么服务器端也用pw.write()方法,就不要注意回车换行了呢?还有使用DataInputStream 的readUTF()方法好像可以替换。
我的意思是服务器端用pw.write()方法,可以不加\r\n,客户端也可以输出结果。而客户端的pw.write()方法为什么必须要加\r\n呢?
刚才写错了,我的意思是服务器端的pw.write()方法,为什么可以省略\r\n,而客户端也是使用的readLine()方法,结果就没问题?
刚才写错了,我的意思是服务器端的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”而已,现在客户端又恢复正常显示了。
刚才写错了,我的意思是服务器端的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的。