一、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,也就是说,服务器套接字将会监听本地机器。