一、BufferedReader和BufferedWriter
客户端代码:
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.OutputStream; 9 import java.io.OutputStreamWriter; 10 import java.net.Socket; 11 import java.net.UnknownHostException; 12 /** 13 * 客户端发送写死的信息给服务器(BufferedWriter),客户端读取服务器响应返回的信息(BufferedReader) 14 * @author whh 15 * 16 */ 17 public class SocketClient1 { 18 public static void main(String[] args) throws UnknownHostException, IOException { 19 20 //创建Socket通信,设置访问服务器的IP和Port 21 Socket socket = new Socket("127.0.0.1",90); 22 //输出流向服务器发送数据消息 23 OutputStream outputStream = socket.getOutputStream(); 24 OutputStreamWriter osw = new OutputStreamWriter(outputStream); 25 BufferedWriter bw = new BufferedWriter(osw); 26 //输入流读取服务器发送来的数据消息 27 InputStream inputStream = socket.getInputStream(); 28 InputStreamReader inputStreamReader =new InputStreamReader(inputStream); 29 BufferedReader br = new BufferedReader(inputStreamReader); 30 //向服务器端发送一条消息 31 bw.write("测试客户端和服务器通信,服务器接收到消息返回到客户端"); 32 bw.newLine(); 33 bw.flush(); 34 System.out.println("我是客户端,已经连接到服务器:"+socket.getRemoteSocketAddress()); 35 36 37 String readLine = null; 38 while ((readLine = br.readLine()) != null){ 39 System.out.println("来自服务端的消息:"+readLine); 40 } 41 socket.close(); 42 } 43 44 }
服务端代码:
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.OutputStreamWriter; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 /** 12 * 服务器读取客户端发送的信息(BufferedReader), 13 * 服务器发送写死的响应信息到客户端(BufferedWriter) 14 * @author whh 15 * 16 */ 17 public class SocketServer1 { 18 public static void main(String[] args) throws Exception{ 19 //服务器建立通信ServerSocket,并设置端口号 20 ServerSocket serverSocket = new ServerSocket(90); 21 System.out.println("启动服务器...."); 22 while(true){ 23 Socket clientSocket = serverSocket.accept();//然后接受新的连接请求 //阻塞直到有客户端连接上 24 System.out.println("客户端:"+clientSocket.getInetAddress().getLocalHost()+"已连接到服务器"); 25 try { 26 process(clientSocket); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 clientSocket.close(); 30 } 31 } 32 33 } 34 public static void process(Socket clientSocket) throws Exception{ 35 System.out.println("client socket连接:"+clientSocket.getRemoteSocketAddress()); 36 //输入流:读取客户端发送信息 37 InputStream in = clientSocket.getInputStream(); 38 InputStreamReader isr = new InputStreamReader(in); 39 BufferedReader br = new BufferedReader(isr); 40 //输出流:返回给客户端响应信息 41 OutputStream out = clientSocket.getOutputStream(); 42 OutputStreamWriter osw = new OutputStreamWriter(out); 43 BufferedWriter bw = new BufferedWriter(osw); 44 String line = null; 45 while ((line = br.readLine()) != null){ 46 System.out.println("来自客户端的消息:" + line); 47 bw.write("welcome from server."); 48 bw.newLine(); 49 bw.flush(); 50 } 51 } 52 }
* 注意事项:转自http://blog.csdn.net/keketrtr/article/details/47128999
上面的java Socket通信用到了BufferedReader的readLine()方法和BufferedWriter的write()方法。
注意readLine()方法,通过查看JDK中关于此方法的注释可知,它是读取一行数据,这行数据的末尾必须有换行符标识符说明到此为止是一行。不然readLine()方法无法顺利读取。
所以在服务器端或客户端进行输出的时候必须输出换行标识(
),让对方可以顺利读取一行。因此可以这样写writer.write("hello world
")。为了更好地使用java的跨平台特性,BufferedWriter提供了一个newLine()方法,该方法就是专门输出一个换行符。所以也可以这样写writer.write("hello world");writer.newLine();
另外既然是BufferedWriter,自然用到了缓冲,当你输出的字符长度不超过缓冲区时,可能不会被输出,这时候程序也无法正常运行。所以要用writer.flush();刷新缓冲区。也就是说writer.write("我接收到你的数据:"+input);writer.newLine();writer.flush();必须一起使用,它们总是同时出现,因此你可以自定义一个方法,包含这三个方法。
public void writeLine(String msg){
writer.write(msg);
writer.newLine();
writer.flush();
}
二、PrintWriter和BufferedReader :在控制台输入,读取
客户端代码:
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.Socket; 10 import java.net.UnknownHostException; 11 import java.util.Scanner; 12 /** 13 * 客户端发送控制台输入的信息给服务器,服务器在控制台输入信息返回给用户:PrintWriter 14 * @author whh 15 * 16 */ 17 public class SocketClient2 { 18 public static void main(String[] args) throws UnknownHostException, IOException { 19 20 // try { 21 //创建Socket通信,设置通信服务器的IP和Port 22 Socket socket = new Socket("127.0.0.1",9090); 23 //建立IO输入流读取服务器发送来的数据消息 24 InputStream inputStream = socket.getInputStream(); 25 InputStreamReader inputStreamReader =new InputStreamReader(inputStream); 26 BufferedReader br = new BufferedReader(inputStreamReader); 27 //建立IO输出流向服务器发送数据消息 28 OutputStream outputStream = socket.getOutputStream(); 29 // OutputStreamWriter osw = new OutputStreamWriter(outputStream); 30 boolean autoflush = true; 31 PrintWriter pw = new PrintWriter(outputStream, autoflush); 32 //在控制台输入信息 33 System.out.println("请输入信息:"); 34 Scanner scan = new Scanner(System.in); 35 String send = scan.nextLine(); 36 //发送到服务器 37 pw.println(send); 38 39 // read the response 40 System.out.println(socket.getRemoteSocketAddress()); 41 String readLine = br.readLine(); 42 System.out.println("来自服务端的消息:"+readLine+"end..."); 43 socket.close(); 44 } 45 46 47 48 49
服务端代码:
1 package main.java; 2 3 import java.io.BufferedReader; 4 import java.io.InputStream; 5 import java.io.InputStreamReader; 6 import java.io.OutputStream; 7 import java.io.OutputStreamWriter; 8 import java.io.PrintWriter; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 import java.util.Scanner; 12 /** 13 * 客户端发送控制台输入的信息给服务器,服务器在控制台输入信息返回给用户:PrintWriter 14 * @author whh 15 * 16 */ 17 public class SocketServer2 { 18 public static void main(String[] args) throws Exception{ 19 //服务器建立通信ServerSocket,并设置端口号 20 ServerSocket serverSocket = new ServerSocket(9090); 21 System.out.println("启动服务器...."); 22 while(true){ 23 Socket clientSocket = serverSocket.accept();//然后接受新的连接请求 //阻塞直到有客户端连接上 24 System.out.println("客户端:"+clientSocket.getInetAddress().getLocalHost()+"已连接到服务器"); 25 try { 26 process(clientSocket); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 clientSocket.close(); 30 } 31 } 32 33 } 34 public static void process(Socket clientSocket) throws Exception{ 35 System.out.println("client socket连接:"+clientSocket.getRemoteSocketAddress()); 36 //输入流 37 InputStream in = clientSocket.getInputStream(); 38 InputStreamReader isr = new InputStreamReader(in); 39 BufferedReader br = new BufferedReader(isr); 40 //输出流 41 OutputStream out = clientSocket.getOutputStream(); 42 OutputStreamWriter osw = new OutputStreamWriter(out); 43 // BufferedWriter bw = new BufferedWriter(osw); 44 PrintWriter pw = new PrintWriter(out,true); 45 String line = null; 46 while ((line = br.readLine()) != null){ 47 System.out.println("客户输入信息为:" + line); 48 //在控制台输入信息 49 System.out.println("请输入返回客户信息:"); 50 Scanner scan = new Scanner(System.in); 51 String messToClient = scan.nextLine(); 52 //发送到客户端 53 pw.println("welcome from server..."+messToClient+"end..."); 54 System.err.println("server end..."); 55 pw.flush(); 56 } 57 58 59 60 61 62 } 63 64 65 66 }
三、SocketTest客户端和SocketServer
1.SocketTest
SocketTest V3.0.0 客户端下载地址:http://sockettest.sourceforge.net/
SocketTest作为客户端测试工具,可以不用写客户端代码,直接连接服务端SocketServer
在IP Address中输入访问服务的IP地址,若访问本机,则输入:127.0.0.1(服务器套接字将会监听本地机器。)
然后点击connect,连接服务器。
连接成功后,在Message输入信息,点击send,发送到服务器。然后可以在conversation with host 查看返回的结果 。
所以 可以借助SocketTest来实现客户端和服务端交互,测试服务端代码是否正确。
2.SocketServer
SocketServer构造方法的重载形式有以下几种:
◆ServerSocket()throws IOException
◆ServerSocket(int port) throws IOException
◆ServerSocket(int port, int backlog) throws IOException
◆ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException //对于这个构造方法,绑定地址必须是java.net.InetAddress的一个实例
如:new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));
其中,参数:port为:服务器要绑定的端口(服务器要监听的端口),
backlog为:这是服务器套接字开始拒绝传入的请求之前,传入的连接请求的最大队列长度
bindAddr为:服务器要绑定的IP地址。
你需要指定IP地址和服务器套接字将要进行监听的端口号。通常,IP地址将会是127.0.0.1,也就是说,服务器套接字将会监听本地机器。