Java基于TCP的网络编程
1.Socket类
- 构造方法
- Socket(InetAddress | String host,int port) 创建连接到指定远程主机和端口号的Socket对象,该构造方法没有指定本地地址和本地端口号,默认使用本地主机IP地址和系统动态分配的端口;
- Socket(InetAddress | String host,int port,InetAddress localAddr ,int localPort)创建连接到指定主机和端口号的Socket对象,并指定本地IP地址和本地端口号,适用用本地主机有多个IP地址的情况
方法 | 功能描述 |
---|---|
public InetAddress getInetAddress() | 返回连接到远程主机的地址,如果连接失败则返回以前连接的主机 |
public int getPort() | 返回Socket连接到远程主机的端口号 |
public int getLocalPort() | 返回本地连接终端的端口号 |
public InputStream getInputStream() | 返回一个输入流,从Socket读取数据 |
public OutputStream getOutputStream() | 返回一个输出流,往Socket中写数据 |
public synchronized void close() | 关闭当前Socket连接 |
- 创建步骤:
-
- 根据指定IP地址和端口号创建一个socket对象
-
- 调用getInputStream()方法或getOutputStream()方法打开连接到Socket的输入/输出流
-
- 客户端和服务器根据协议进行交互,直到关闭连接
-
- 关闭客户端的Socket
-
实例代码
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 |
package com.rain.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException; public class SocketDemo { public static void main(String[] args) { try { //创建连接到本机、端口为28888的Socket对象 java.net.Socket socket = new java.net.Socket("127.0.0.1", 28888); // 将Socket对应的输出流包装成PrintStream PrintStream ps = new PrintStream(socket.getOutputStream()); // 往服务器发送信息 ps.println("我是121"); ps.flush(); // 将Socket对应的输入流包装成BufferedReader BufferedReader br = new BufferedReader(new InputStreamReader( socket.getInputStream())); // 读服务器返回的信息并显示 String line = br.readLine(); System.out.println("来自服务器的数据:" + line); // 关闭 br.close(); ps.close(); socket.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } |
上面的代码创建了一个连接到本机,端口为28888的Socket对象;再使用getOutputStream()获取Socket对象的输出流,用于往服务器发送信息,然后使用getInputStream()获取Socket对象的输入流,读取服务器返回的数据;最后关闭输入/输出流和Socket连接,释放所有的资源
2.ServerSocket类
ServerSocket是服务器套接字,运行在服务器端,通过指定端口主动监听来自客户端的Socket连接,当客户端发送Socket请求并与服务器端建立连接时,服务器将验证并接受客户端的Socket,从而建立客户端与服务器之间的网络虚拟链路,一旦两端的实体之间建立了虚拟链路,就可以互相传送数据。
- 构造方法
- ServerSocket(int port)---- 根据指定端口来创建一个ServerSocket对象;
- ServerSocket(int port,int backlog)----创建一个ServerSocket对象,指定端口和连接队列长度,此时增加一个用来改变连接队列长度的参数backlog;
- ServerSocket(int port,int backlog,InetAddress localAddr)----创建一个ServerSocket对象,指定端口,连接队列长度和IP地址;当机器拥有多个IP地址时,才允许使用localAddr参数指定具体的IP地址。
方法 | 功能描述 |
---|---|
public Socket accept() | 接受客户端Socket连接请求,并返回 一个与客户端Socket对应的Socket实例;该方法是一个阻塞方法,如果没有接收到客户端发送的Socket,则一直处于等待状态,线程也会被阻塞 |
public InetAddress getInetAddress() | 返回当前ServerSocket实例的地址信息 |
public synchronized void close() | 关闭当前Socket实例 |
- 具体步骤:
-
- 根据指定的端口号来实例化一个ServerSocket对象;
-
- 调用serverSocket对象的accept()方法接受客户端发送的Socket对象;
-
- 调用Socket对象的getInputStream()/getOutputStream()方法来建立与客户端进行交互的IO流
-
- 服务器与客户端根据一定的协议交互,直到关闭连接;
-
- 关闭服务器端的Socket;
-
- 回到第2步,继续监听下一次客户端发送的Socket请求连接;
-
示例代码:
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 com.rain.demo; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; /** * Created by w-pc on 2017/03/15. */ public class ServerSocketDemo extends Thread{ ServerSocket server; int num = 0; public ServerSocketDemo(){ try { server = new ServerSocket(28888); }catch (IOException e){ e.printStackTrace(); } this.start(); System.out.println("Start....."); } public void run(){ while (this.isAlive()){ try { Socket socket = server.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = br.readLine(); System.out.println(line); PrintStream ps = new PrintStream(socket.getOutputStream()); ps.println("您是第"+(++num)+"个访问服务器的用户!"); ps.flush(); br.close(); ps.close(); socket.close(); }catch (IOException e){ e.printStackTrace(); } } } public static void main(String[] args) { new ServerSocketDemo(); } } |