Java 点对点通信(Socket 基于 TCP)

概要:

Socket通常称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过Socket向网络发出请求或者应答网络请求。Socket是在建立网络连接时使用。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。·对于一个网络连接来说,socket是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。

Socket服务器端需要在某个端口上开启服务器端类型的类:java.net.ServerSocket。通过accept()方法用于产生“阻塞”,直到接收到一个连接,并且返回一个客户端的Socket对象实例。“阻塞”是使程序运行暂时“停留”在这个地方,直到一个会话产生,然后程序继续;通常“阻塞”是由循环产生的。

Socket客户端根据服务器端的IP地址和端口号创建一个Socket对象,连接服务器。

服务器端和客户端都持有一个Socket对象,服务器端的Socket从服务器端指向客户端,而客户端的Socket从客户端指向服务器端,就像在服务器端和客户端建立了两条单向的管道。

| |目录

Socket服务器端

package net.xsoftlab.baike;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

class SocketServer {
	private int port;// 端口

	public SocketServer(int port) {// 带参数的构造方法进行初始化
		this.port = port;
		start();// 调用启动服务器端的方法
	}

	public String infoUpperCase(String line) {// 处理信息
		return line.toUpperCase();// 将字符串大写
	}

	public void start() {// 启动服务器端
		try {
			ServerSocket serverSocket = new ServerSocket(port);// 根据端口创建服务器端Socket对象
			System.out.println("服务器已启动,监听端口号为:" + port);// 显示连接信息
			System.out.println("正在等待客户端连接.........");
			Socket socketAccept = serverSocket.accept();// 挂起等待客户的请求
			BufferedReader in = new BufferedReader(new InputStreamReader(socketAccept.getInputStream()));// 获取读取客户端的数据流
			PrintWriter out = new PrintWriter(socketAccept.getOutputStream(), true);// 获取写往客户端的数据输出流,true:自动刷新
			out.println("服务器端连接成功.........");// 向客户发送连接信息
			out.println("输入exit断开与服务器的连接");
			boolean done = false;
			while (!done) {
				String line = in.readLine();// 读取客户端每行的内容
				if (line == null) {// 没有写则不读取
					done = true;
				} else {
					System.out.println("客户端传来的内容:" + line);// 显示客户端发送的内容
					String message = infoUpperCase(line);// 信息处理
					out.println("从服务器端口发送的内容:" + message);// 向客户端发送信息
					if (line.trim().equals("exit"))// 退出判断
						done = true;
				}
			}
			socketAccept.close();// 关闭通信资源
		} catch (Exception e) {// 捕获异常
			System.out.println("启动服务器端出现错误:" + e.getMessage());
		}
	}
}

public class TestSocketServer {// 操作Socket服务器端的类
	public static void main(String[] args) {// java程序主入口处
		try {
			SocketServer server = new SocketServer(8080);// 传入端口号实例化对象
		} catch (Exception e) {// 捕获异常
			System.out.println("测试服务器端监听出错:" + e.getMessage());
		}
	}
}

Socket客户端

package net.xsoftlab.baike;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

class Client {
	private String host;// IP地址(域名)
	private int port;// 端口号

	public Client(String host, int port) {// 带参数构造方法进行初始化
		this.host = host;
		this.port = port;
		connectSocket();// 调用连接方法
	}

	public void connectSocket() {// 连接方法
		try {
			Socket socketConn;// 声明Socket连接
			if (host.equals("localhost") || host.equals("127.0.0.1")) {// 判断IP地址(域名)如果是本机localhost
				socketConn = new Socket(InetAddress.getLocalHost(), port);// 创建本地连接
			} else {
				socketConn = new Socket(InetAddress.getByName(host), port);// 创建远程连接
			}
			BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));// 获得从键盘输入的流
			PrintWriter out = new PrintWriter(socketConn.getOutputStream(), true);// 获得服务器写内容的数据流
			BufferedReader in = new BufferedReader(new InputStreamReader(socketConn.getInputStream()));// 获得接收服务器发送内容的缓冲流
			System.out.println("服务器信息:" + in.readLine());// 从服务器获得信息
			System.out.println("服务器信息:" + in.readLine());
			System.out.print("请输入>");// 用户输入
			boolean done = false;
			while (!done) {
				String line = stdin.readLine();// 获得从键盘输入的每行字符
				out.println(line);// 发送到服务端
				if (line.equalsIgnoreCase("exit"))// 读到exit则结束循环
					done = true;
				String info = in.readLine();// 从服务器读取字符串
				System.out.println("服务器信息:" + info);// 显示从服务器发送来的数据
				if (!done)// 用户输入
					System.out.print("请输入>");
			}
			socketConn.close();// 关闭资源
		} catch (SecurityException e) {// 捕获安全性错误时引发的异常
			System.out.println("连接服务器出现安全问题!");
		} catch (IOException e) {// 捕获IO流异常
			System.out.println("连接服务器出现I/O错误!");
		}
	}
}

public class TestSocketClient {// 操作Socket客户端类
	public static void main(String[] args) {// java程序主入口处
		try {
			new Client("localhost", 8080);// IP地址为本机,端口为80
		} catch (Exception e) {// 捕获异常
			System.out.println("测试客户端连接出错:" + e.getMessage());
		}
	}
}


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消