java网络编程基于TCP的多客户端连接服务器

一、使用多线程实现多客户端连接服务端代码:

package com.test.net;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

class TCPThreadServerSocket implements Runnable {
	private Socket socket = null;
	private InputStream in = null;
    private OutputStream out = null;
	public TCPThreadServerSocket(Socket s) {
		this.socket = s;
	}

	@Override
	public void run() {
		try {
			//获取服务端输入的消息
			in = socket.getInputStream();
			//服务端返回的消息
			out = socket.getOutputStream();
			//用一个字节数字来存放消息,提高效率
			byte[] recData = new byte[1024];
			in.read(recData);
			String data = new String(recData);

			System.out.println("读取到客户端发送来的数据:" + data);
			//返回给客户端的消息
			out.write("Hello client I am server".getBytes());

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				//关闭资源
				in.close();
				out.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

public class TCPThreadServer {
	private static final int PORT = 6666;

	public static void main(String[] args) {
		int count = 1;
		try {
			/**
			 * 创建一个ServerSocket对象,并给它制定一个端口号,
			 * 通过这个端口号来监听客户端的连接,服务端接受客户端连接的请求是
			 * 不间断地接受的,所以服务端的编程一般都永无休止的运行
			 */
			ServerSocket ss = new ServerSocket(PORT);
			System.out.println("服务器已经启动。。。");
			while (true) {
				/**
				 * 在服务端调用accept()方法接受客户端的连接对象,accept()方法是
				 * 一个阻塞式的方法,一直傻傻地等待着是否有客户端申请连接
				 */
				
				Socket s = ss.accept();
				System.out.println("第" + count + "个连接,IP地址是:"
						+ s.getInetAddress());
				count++;
				/**
				 * 服务端使用多线程方便多客户端的连接
				 * 这里将服务端的socket传给内部类,方便每个客户端都创建一个线程
				 */
				Thread t = new Thread(new TCPThreadServerSocket(s));
				t.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

二、客户端A代码:

package com.test.net;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TCPClientASocket {

	private static final int PORT = 6666;
	
	public static void main(String[] args) {
		Socket s = null;
		OutputStream out = null;
		InputStream in = null;
		DataOutputStream dos = null;
		DataInputStream dis = null;
		String serverHost = "127.0.0.1";
		byte[] b = new byte[1024];
		try {
			/**
			 * 客户端通过IP和端口和服务器连接,连接上服务端后
			 * 就可以像服务端输出消息和接受服务端返回的消息
			 * 通过IP就能找到一台独一无二的电脑终端,通过PORT找到
			 * 终端的某一个独立的应用程序
			 */
			s = new Socket(serverHost, PORT);
			out = s.getOutputStream();
			dos = new DataOutputStream(out);
			dos.write("Hello Server I am client A".getBytes());
			in = s.getInputStream();
			dis = new DataInputStream(in);
		    dis.read(b);
			String serverToClient = new String(b);
				System.out.println("服务端返回到客户端的信息:"+serverToClient);
		} catch (UnknownHostException e) {
			System.out.println("Host未知。。。");
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				//最后要关闭资源
				out.close();
				in.close();
				dos.close();
				dos.close();
				s.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

客户端B代码和A的基本一样

三、运行结果:

先启动服务端再运行客户端A代码和客户端B代码,运行结果如下:



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚人节第二天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值