Java 点对面通信(Socket基于TCP/IP)

概要:

创建多客户连接的socket通信方式是在服务器端创建客户连接请求的监听线程,一旦客户端发起请求,则服务器端创建用于与此客户端通信的线程和Socket,服务器把与此客户的通信交给此线程进行处理。同时,继续在服务器指定端口进行监听,来响应其他客户的服务请求。

每一个客户端和服务器中的线程可以认为是单客户端通信模式下的客户端和服务器。一旦Socket和线程建立,服务器主程序会把与某个客户的通信完全交给线程去处理,并利用相应的Socket完成与客户的通信。

| |目录

socket面服务器端

package net.xsoftlab.baike;

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

class FaceServer extends ServerSocket {// socket面服务器端
	public FaceServer(int port) throws IOException {
		super(port);// 继承其类的port
		System.out.println("服务器已启动,监听端口号为:" + port);
		System.out.println("正在等待客户连接.........");
		try {
			while (true) {// 循环挂起等待客户的请求
				Socket socketCon = accept();
				new ServerThread(socketCon, port);// 建立服务线程
			}
		} catch (IOException e) {
			System.out.println("没有监听到客户端的信息......");
		} finally {
			close();// 关闭通信资源
		}
	}
}

class ServerThread extends Thread {// 继承线程类实现服务线程
	private Socket socketCon;
	private BufferedReader in;
	private PrintWriter out;

	public ServerThread(Socket s, int port) throws IOException {
		this.socketCon = s;
		in = new BufferedReader(new InputStreamReader(socketCon.getInputStream(), "gb2312"));// 读取客户端的数据流
		// 获取写往客户端的数据输出流,true:自动刷新
		out = new PrintWriter(socketCon.getOutputStream(), true);
		out.println("服务器端连接成功.........");// 向客户发送连接信息
		out.println("输入exit断开与服务器的连接");
		start();// 启动线程
	}

	@Override
	public void run() {
		try {
			boolean done = false;
			while (!done) {
				String line = in.readLine();// 读取客户端每行的内容
				if (line == null)
					done = true;
				else {
					System.out.println("客户端传来的内容:" + line);// 显示客户端发送的内容
					out.println("从服务器端口发送的内容:" + line);// 向客户端发送信息
					if (line.trim().equals("exit"))// 退出判断
						done = true;
				}
			}
			System.out.println("客户端终止发送信息......");
			socketCon.close();// 关闭通信资源
		} catch (Exception e) {// 捕获异常
			System.out.println("启动服务器端出现错误:" + e.getMessage());
		}
	}
}

public class TestFaceServer {

	@SuppressWarnings("resource")
	public static void main(String[] args) {// java程序主入口处
		try {
			new FaceServer(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 PointClient {
	private String host;// IP地址(域名)
	private int port;// 端口号

	public PointClient(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 TestPointClient {
	public static void main(String[] args) {// java程序主入口处
		try {
			new PointClient("localhost", 8080);// IP地址为本机,端口为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 {// Socket客户端
	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地址为本机,端口为8080
		} catch (Exception e) {// 捕获异常
			System.out.println("测试客户端连接出错:" + e.getMessage());
		}
	}
}


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