基于TCP的单客户和服务器

1 篇文章 0 订阅

基于TCP协议的通信是客户端和服务器建立连接通道,这个管道就像一个输出输入流,发送信息使用输出流,接收信息使用输入流。

//单客户于服务器

//单客户端的连接
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

//单客户端,在应用中后运行
public class EchoClient {
	public static void main(String[] args) {
		String hostName = "";//服务器的IP地址,这里表示本机,相当于127.0.0.1
		int portNumber = 8;
		try {
			//客户端通过创建Socket,通过服务器的IP地址和端口号,连接服务器
			Socket echoSocket =new Socket(hostName,portNumber);
			PrintWriter out =new PrintWriter(echoSocket.getOutputStream(),true);
			BufferedReader in =new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
			BufferedReader stdIn =new BufferedReader(new InputStreamReader(System.in));
			String userInput;
			while((userInput = stdIn.readLine()) != null) {
				out.println(userInput);
				System.out.println("echo:"+ in.readLine());
			}
		}catch(UnknownHostException e) {
			e.printStackTrace();
			System.exit(1);
		}catch(IOException e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}
//服务器端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {
	public static void main(String[] args) {
		try {
			ServerSocket serverSocket = new ServerSocket(8);
			Socket clientSocket = serverSocket.accept();
			PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true);
			BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
			String inputLine;
			while((inputLine = in.readLine()) != null) {
				System.out.println("来自客户端:"+inputLine);
				out.println(inputLine);
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
}

在这里插入图片描述

//多客户与服务器

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

public class EchoMultiClient {
	public EchoMultiClient() {
		String hostName = "";
		int portNumber = 7;
		try {
			Socket echoSocket = new Socket(hostName,portNumber);
			PrintWriter out = new PrintWriter(echoSocket.getOutputStream(),true);
			BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
			BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("客户端:"+echoSocket.getLocalAddress().getHostName()+":"+echoSocket.getLocalPort());
			//发送信息的线程,用输出流out实现发数据到服务器
			new Thread(new Runnable() {//实现一个匿名Runnable类,创建匿名对象,并用匿名对象创建Thread线程对象
				public void run() {
					String userInput;
					try {
						while((userInput = stdIn.readLine()) !=null) {
							out.println(userInput);
						}
					}catch(IOException e) {
						e.printStackTrace();
						System.exit(1);
					}
				}
			}).start();
			new Thread(new Runnable() {
				public void run() {
					String receiveStr;
					try {
						while((receiveStr = in.readLine()) !=null) {
							System.out.println("echo:"+receiveStr);
						}
					}catch(IOException e) {
						e.printStackTrace();
						System.exit(1);
					}
				}
			}).start();
		}catch(UnknownHostException e) {
			e.printStackTrace();
		}catch(IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new EchoMultiClient();
	}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class EchoMultiServer {
	ServerSocket serverSocket;
	List<Socket> clients = new ArrayList<Socket>();
	public EchoMultiServer() {
		try {
			serverSocket = new ServerSocket(7);
			while (true) {
				Socket clientSocket = serverSocket.accept();
				clients.add(clientSocket);
				new EchoServerThread(clientSocket,clients).start();
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		new EchoMultiServer();
	}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.List;

public class EchoServerThread extends Thread{
	Socket myClient;
	List<Socket> clients;
	String clientHostname;
	int clientPort;
	public EchoServerThread(Socket myClient,List<Socket> clients) {
		super();
		this.myClient = myClient;
		this.clients = clients;
	}
	public void run() {
		InetSocketAddress clientAddress =(InetSocketAddress) 
				myClient.getRemoteSocketAddress();
		clientHostname = clientAddress.getHostName();
		clientPort = clientAddress.getPort();
		System.out.println("第"+clients.size()+"个客户端:"+clientHostname+":"+clientPort+"已连接");
		try {
			String inStr;
			BufferedReader in = new BufferedReader(new InputStreamReader(myClient.getInputStream()));
			while((inStr = in.readLine()) !=null) {
				System.out.println(inStr+"。来自"+clientHostname+":"+clientPort+"");
				for(Socket client :clients) {
					if(client != null) {
						PrintWriter out = new PrintWriter(client.getOutputStream(),true);
						out.println(inStr+"。来自"+clientHostname+":"+clientPort+"");
					}
				}
			}
		}catch(IOException e) {
			System.err.println(clientHostname+":"+clientPort+"退出了");
		}
	}
}

注意:运行时先运行服务器端在运行客户端

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值