java040:网络编程下的TCP案例

一,用程序的方式,实现两个人相互打电话的过程。,听到有一方说拜拜就挂机。

Scoket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求
在 java中Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端
Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例
操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别
不因为在服务器端或在客户端而产生不同的级别,不管是Socket还是ServerSocket他们的
工作都是通过Socket类和其子类来完成的

建立Socket链接可分三个步骤:
1.服务器监听
2.客户端发出请求
3.建立链接
4.通信
服务器代码:

package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
//服务器
public class Server {
	public static void main(String[] args) throws IOException {
		//创建服务器对象
		ServerSocket server=new ServerSocket(8888);
		System.out.println("服务器开机。。");
		//等待客户接入,此时如果没有客户接入,流程就在此阻塞
		Socket client=server.accept();
		System.out.println("有朋自远方来,不亦乐乎!!");	
		//通信,起点是服务器,终点是客户端
		OutputStream out=client.getOutputStream();
		OutputStreamWriter osw=new OutputStreamWriter(out);
		BufferedWriter bw=new BufferedWriter(osw);
		//接收信息
		InputStream in=client.getInputStream();
		InputStreamReader isr=new InputStreamReader(in);
		BufferedReader br=new BufferedReader(isr);
		Scanner s=new Scanner(System.in);
		//输入信息
		while(true){
			System.out.println("服务器请说话。。");
			String msg=null;
			msg=s.nextLine();//只以回车作为结束
			bw.write(msg);
			bw.newLine();
			bw.flush();
			if(msg.equals("拜拜")){
				break;
			}
			msg=br.readLine();
			System.out.println(msg);
			if(msg.equals("拜拜")){
				break;
			}	
		}
	}
}

客户端代码:

package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
//客户端
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket server=new Socket("127.0.0.1",8888);//本地,端口号8888
		System.out.println("链接上了服务器");
		//起点是服务器,终点是客户端
		InputStream in=server.getInputStream();
		InputStreamReader isr=new InputStreamReader(in);
		BufferedReader br=new BufferedReader(isr);
		OutputStream out=server.getOutputStream();
		OutputStreamWriter osw=new OutputStreamWriter(out);
		BufferedWriter bw=new BufferedWriter(osw);
		Scanner s=new Scanner(System.in);
		while(true){
			String msg=null;
			msg=br.readLine();
			System.out.println(msg);
			System.out.println("客户端请说话。。");
			if(msg.equals("拜拜")){
				break;
			}
			msg=s.nextLine();
			bw.write(msg);
			bw.newLine();
			bw.flush();
			if(msg.equals("拜拜")){
				break;
			}
		}
	}
	}

二,服务器把客户端说的话往回转发
和上面差不多,只是服务器不再输入了,而是直接转发客户端发来的消息而已
服务器代码:

package 网络编程;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
	public static void main(String[] args) throws IOException {
	//服务器代码
		ServerSocket server=new ServerSocket(8888); //创建服务器
		System.out.println("服务器开机");
		Socket client=server.accept();
		//服务器给客户端发消息
		OutputStream os=client.getOutputStream();
		OutputStreamWriter osw=new OutputStreamWriter(os);
		BufferedWriter bw=new BufferedWriter(osw);
		//服务器接收客户端的消息
		InputStream is=client.getInputStream();
		InputStreamReader isr=new InputStreamReader(is);
		BufferedReader br=new BufferedReader(isr);
		System.out.println("服务器链接上了");
		while(true){
			String s=null;
			s=br.readLine();
			bw.write(s);
			bw.newLine();
			bw.flush();
			if(s.equals("拜拜")){
				break;
			}
		}
	}
}

客户端代码:

package 网络编程;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket server=new Socket("127.0.0.1",8888);
		System.out.println("链接上了服务器");
				//客户端给服务器发消息
				OutputStream os=server.getOutputStream();
				OutputStreamWriter osw=new OutputStreamWriter(os);
				BufferedWriter bw=new BufferedWriter(osw);
				//客户端接收服务器的消息
				InputStream is=server.getInputStream();
				InputStreamReader isr=new InputStreamReader(is);
				BufferedReader br=new BufferedReader(isr);
				Scanner sc=new Scanner(System.in);
				while(true){
					String s=null;
					s=sc.nextLine();
					bw.write(s);
					bw.newLine();
					bw.flush();
					if(s.equals("拜拜")){
						break;
					}
					s=br.readLine();
					System.out.println(s);
				}
	}
	}

三,做一个群聊模拟
既然是群聊,就是所有人都可以抢着说话,不能等一个人说完在让其他人说,所以客户端是一个多线程状态。服务器不能等转发完一个人的消息再转发其他人的,不能让其他人的消息排队等着,所以服务器也是一个多线程的。
服务器代码:

package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
//**********************************************************************
class S implements Runnable{
	private Socket client;
	public S(Socket client){
		this.client=client;
	}
	//任务,服务器处理用户的请求
	public void run() {
		try {
			//通信,起点是服务器,终点是客户端
			OutputStream out=null;
			InputStream in=client.getInputStream();
			InputStreamReader isr=new InputStreamReader(in);
			BufferedReader br=new BufferedReader(isr);
			while(true){
				String msg=null;
				msg=br.readLine();
				//开始广播
				for (int i = 0; i <Server.list.size(); i++) {
					Socket client=Server.list.get(i);  //放到集合里面
					out=client.getOutputStream();
					OutputStreamWriter osw=new OutputStreamWriter(out);
					BufferedWriter bw=new BufferedWriter(osw);
					bw.write(msg);
					bw.newLine();
					bw.flush();
					if(msg.equals("拜拜")){
						break;
					}
				}
			}
		} catch (Exception e) {	
		}	
	}	
}
//**************************************************************************
//服务器
public class Server {
	public static List<Socket> list=new ArrayList<Socket>();
	public static void main(String[] args) throws IOException {
		//创建服务器对象
		ServerSocket server=new ServerSocket(8888);
		System.out.println("服务器开机。。");
		while(true){
			//等待客户接入,此时如果没有客户接入,流程就在此阻塞
			Socket client=server.accept();//来一个接受一个
			System.out.println("有朋自远方来,不亦乐乎!!");
			S s=new S(client);
			Thread t=new Thread(s);
			t.start();
			list.add(client);
		}	
	}
}

客户端代码:

package 网络编程;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
//********************************************************************************
class C implements Runnable{
	Socket server;
	public C(Socket server){
		this.server=server;
	}
	//任务,时刻保持接收信息
	public void run() {
		while(true){
			try {
				InputStream in=server.getInputStream();
				InputStreamReader isr=new InputStreamReader(in);
				BufferedReader br=new BufferedReader(isr);
				String msg=null;
				msg=br.readLine();
				System.out.println(msg);
			} catch (Exception e) {
			}	
		}	
	}	
}
//客户端
//***********************************************************************************
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		Socket server=new Socket("127.0.0.1",8888);
		System.out.println("链接上了服务器");
		//起点是服务器,终点是客户端
		C c=new C(server);
		Thread t=new Thread(c);
		t.start();
		OutputStream out=server.getOutputStream();
		OutputStreamWriter osw=new OutputStreamWriter(out);
		BufferedWriter bw=new BufferedWriter(osw);
		Scanner s=new Scanner(System.in);
		Scanner sn=new Scanner(System.in);
		System.out.println("请输入你的名字");
		String name=sn.nextLine();
		while(true){
			String msg=null;
			msg=s.nextLine();
			bw.write(name+":"+msg);
			bw.newLine();
			bw.flush();
			if(msg.equals("拜拜")){
				break;
			}	
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44699728/article/details/90208994