Java基于TCP的网络编程

algorain

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连接

  • 创建步骤:
      1. 根据指定IP地址和端口号创建一个socket对象
      1. 调用getInputStream()方法或getOutputStream()方法打开连接到Socket的输入/输出流
      1. 客户端和服务器根据协议进行交互,直到关闭连接
      1. 关闭客户端的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
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实例

  • 具体步骤:
      1. 根据指定的端口号来实例化一个ServerSocket对象;
      1. 调用serverSocket对象的accept()方法接受客户端发送的Socket对象;
      1. 调用Socket对象的getInputStream()/getOutputStream()方法来建立与客户端进行交互的IO流
      1. 服务器与客户端根据一定的协议交互,直到关闭连接;
      1. 关闭服务器端的Socket;
      1. 回到第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
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();
}
}

上述代码服务器端是一个多线程应用程序,能为多个客户提供服务。在ServerSocketDemo构造方法中,先创建一个用于监听28888端口的ServerSocket对象,在调用this.start()方法启动线程。在线程的run()方法中,先调用ServerSocket对象的accept()方法来接收客户端发送的Socket对象,再使用getInputStream()获取Socket对象的输入流,用于读取客户端发送的数据信息;然后使用getOutputStream()获取Socket对象的输出流,往客户端发送信息;最后关闭输入,输出流和Socket释放所有的资源。

  • Title: Java基于TCP的网络编程
  • Author: algorain
  • Created at: 2017-03-15 16:17:23
  • Updated at: 2023-05-14 21:39:50
  • Link: http://www.rain1024.com/2017/03/15/java-article66/
  • License: This work is licensed under CC BY-NC-SA 4.0.
 Comments