- ·上一篇文章:java实现打飞机游戏源码
- ·下一篇文章:IP地址,协议,端口号
Java网络编程-Socket通信
-->
Socket通信
TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据。
当两个程序需要通信时,他们可以通过使用Socket类建立套接字对象并连接在一起(端口号和IP地址组合得出一个网络套接字)
java基于TCP协议实现网络通信的类
客户端Socket类的构造方法:
1 2 3 4 5 6 7 8 9 10 | try { Socket socket = new Socket("localhost", 800); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } |
服务器端ServerSocket类的构造方法:
1 2 3 4 5 6 | try { ServerSocket server = new ServerSocket(800); } catch (IOException e) { e.printStackTrace(); } |
Socket通信模型
Socket通信实现步骤
1.创建ServerSocket和Scoket
2.打开连接到Socket的输入/输出流
3.按照协议对Socket进行读/写操作
4.关闭输入输出流,关闭Socket
java实现步骤:
服务器端:
1.创建ServerSocket对象,绑定相应端口
2.通过accept()方法监听客户端请求
3.连接建立后,通过输入流读取客户端发送的请求信息。
4.通过输出流向客户端发送响应信息。
5.关闭相关资源
客户端:
1.创建Socket对象,指明需要连接的服务器的地址和端口号
2.连接建立后,通过输出流向服务器端发送请求信息。
3.通过输入流获取服务器响应信息。
4.关闭相关资源
客户端与服务器通信实例
【Socket_Server.java】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | package cn.k88.net_Demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Socket_Server { public static void main(String[] args) { try { // 创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 ServerSocket server = new ServerSocket(12345); System.out.println("*****服务器即将启动,等待客户端连接****"); // 调用accept()方法开始监听,等待客户端的连接 Socket socket = server.accept(); // 获取输入流,用来读取客户端信息 InputStream is = socket.getInputStream(); // 字节输入流 // 将字节输入流包装成字符输入流 InputStreamReader isr = new InputStreamReader(is); // 将字符输入流增加缓冲 BufferedReader br = new BufferedReader(isr); String info = null; while ((info = br.readLine()) != null) { System.out.println("我是服务器:客户端说:" + info); } socket.shutdownInput(); // 关闭输入流 // 获取输出流,用于响应客户端的请求 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("http://www.k88.net"); pw.flush();// 刷新缓存 // 关闭资源 pw.close(); os.close(); br.close(); isr.close(); is.close(); socket.close(); server.close(); } catch (IOException e) { e.printStackTrace(); } } } |
【Socket_Client.java】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | package cn.k88.net_Demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Socket_Client { public static void main(String[] args) { try { // 创建客户端Socket,指定服务器地址和端口 Socket client = new Socket("localhost", 12345); // 获取输出流向服务器发送信息。 OutputStream os = client.getOutputStream(); // 字节输出流 PrintWriter pw = new PrintWriter(os); // 将输出流包装成打印流 pw.write("k88网站多少?"); pw.flush(); // 刷新缓存 client.shutdownOutput(); // 关闭输出流 // 获取输入流, InputStream is = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while ((info = br.readLine()) != null) { System.out.println("我是客户端:服务器回答说:" + info); } br.close(); is.close(); pw.close(); os.close(); client.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
使用多线程实现多客户端的通信
使用了多线程将client和server读写分开,实现了client和server即时通信。因此解决了scanner输入流堵塞线程问题。另外accept方法增加了循环,可以实时监听多客户端的连接。
代码就不一一贴出来了。自己网盘拿吧。
Java网络编程-Socket通信