socket客户端和服务端通信

一、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()方法无法顺利读取。
所以在服务器端或客户端进行输出的时候必须输出换行标识(\n),让对方可以顺利读取一行。因此可以这样写writer.write("hello world\n")。为了更好地使用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,也就是说,服务器套接字将会监听本地机器。

 

 

 

 

 

posted @ 2017-11-24 12:02  青山不改,绿水长流  阅读(436)  评论(0编辑  收藏  举报