一、简介
从这起,开始介绍网络编程, 这里介绍以tcp协议方式进行连接的同步阻塞式socket编程。
同步阻塞是指通信开始时,工作线程等待直到连接上为止,数据传输时,也是等待直到获取数据为止。
即是包含两个等待过程,期间就是等待,不做任何事。
二、知识点
1、阻塞与非阻塞
是相对于连接过程是否等待,或者说连接中是否可做其它事。
serverSocket接收socket连接且等待直到连接上为止,即为阻塞。
serverSocket接口连接后,不等待连接上,又去接收新的连接,轮询地处理连接或连接就绪等事件,即为非阻塞。
2、同步与异步
是相对于结果而言的,即是否等待结果返回。等待结果的即是同步,不等待结果的即是异步。
在这里,socket等待直到读取到数据为止,即是同步。
socket不等待读取到数据,而去做别的事,当数据准备好后,会通知socket数据已经准备好了,这就是异步。
3、通信步骤
通常包含两个步骤,即服务连接和数据传输(包含读和写)。
4、端口
通常服务端口不能在1到1023之间,如果端口设置为0,即表示由服务器自动分配任意端口。
三、服务端实例
这里采用主线程接收连接请求,另起线程处理连接的读和写操作。
关键代码:
new ServerSocket(port, maxConnections),创建并开启服务;
server.accept(),接收连接请求;
socket.getInputStream(),连接读入口;
socket.getOutputStream(),连接写入口;
代码实例如下:
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TcpSocketServerMain { public static void main(String[] args) throws Exception { //端口号 int port = 7001; //最大连接数 int maxConnections = 3; //创建ServerSocket,开启服务 ServerSocket server = new ServerSocket(port, maxConnections); //循环接收连接 while (true) { try { Socket socket = server.accept(); System.out.println("receive connection, address:" + socket.getInetAddress() + " port:" + socket.getLocalPort()); //另起线程处理该连接的读写 new DisposeSocketThread(socket).start(); } catch (Exception e) { } } } /** * 处理连接socket的读写 */ static class DisposeSocketThread extends Thread{ private Socket socket; private DisposeSocketThread(Socket socket){ this.socket = socket; } @Override public void run() { try{ PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //循环接收和发送 while (true) { //读取消息 System.out.println("receive msg: " + br.readLine()); //输入消息 System.out.print("send msg:"); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //发送消息 pw.println(input.readLine()); pw.flush(); } }catch (Exception e){ } } } }
四、客户端实例
这里直接使用主线程进行连接、读、写操作,
关键代码:
new Socket(host, port),创建socket并连接服务器;
dsocket.getInputStream(),连接读入口;
socket.getOutputStream(),连接写入口;
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class TcpSocketMain { public static void main(String[] args) throws Exception { //连接地址 String host = "127.0.0.1"; //端口号 int port = 7001; //创建socket连接 Socket socket = new Socket(host, port); PrintWriter pw = new PrintWriter(new OutputStreamWriter(socket.getOutputStream())); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //循环发送和接收 while (true) { try { //输入消息 System.out.print("send msg:"); BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); //发送消息 pw.println(input.readLine()); pw.flush(); //接收消息 System.out.println("receive msg: " + br.readLine()); } catch (Exception e) { } } } }