欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Socket实现客户端与服务端的消息互传

程序员文章站 2022-04-21 10:34:38
Socket实现客户端与服务端的消息互传简述代码服务端客户端简述针对之前客户端与服务端连接后服务端不能发送消息做出了修改,使服务端与客户端实现消息互通。之前的链接: https://blog.csdn.net/qq_41512314/article/details/107636086客户端图示:服务端图示: 代码服务端import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.InputStrea...

Socket实现客户端与服务端的消息互传

简述

针对之前客户端与服务端连接后服务端不能发送消息做出了修改,使服务端与客户端实现消息互通。
之前的链接: https://blog.csdn.net/qq_41512314/article/details/107636086

客户端图示:
Socket实现客户端与服务端的消息互传

服务端图示:
Socket实现客户端与服务端的消息互传

代码

服务端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 服务端
 * @author 凌风
 *
 */
public class Server extends Thread{
	/*
	 * java.net.ServerSocket 
	 * 运行在服务端的ServerSocket主要有两个作用
	 * 1:向系统申请服务端口,客户端就是通过这个端口与服务端建立连接的。
	 * 
	 * 2:监听该端口,这样一旦一个客户端通过该端口尝试建立连接时,ServerSocket就会自动实例化
	 *   一个Socket,那么通过这个Socket就可以与客户端对等并进行数据交互了。  
	 */
	ServerSocket server;
	Socket socket;
	
	public Server() {
		try {
			/*
			 * 实例化ServerSocket的同时要向系统
			 * 申请服务端口,客户端就是通过这个端
			 * 口与服务端建立连接的。
			 */
			System.out.println("正在启动服务端...");
			server = new ServerSocket(8080);
			System.out.println("服务端启动完毕!");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	@Override
	public void run() {
		super.run();
		try {
			/*
			 * Socket accept()
			 * ServerSocket的accept方法是一个阻塞
			 * 方法,调用后会一直等待,直到一个客户端
			 * 建立连接为止,此时该方法会返回一个Socket
			 * 实例,通过这个Socket就可以与刚连接上的
			 * 客户端进行数据交互了。
			 * 多次调用accept可以等待不同客户端的连接
			 */
			while(true) {
				System.out.println("等待客户端连接...");
				socket = server.accept();
				System.out.println("一个客户端连接了!");
				
				//连接并返回socket后,再启用发送消息线程
				new sendThread().start();
		
				/*
				 * 通过Socket获取输入流,可以读取到远端
				 * 计算机发送过来的字节。
				 */
				InputStream in = socket.getInputStream();
				InputStreamReader isr = new InputStreamReader(in,"UTF-8");
				BufferedReader br = new BufferedReader(isr);
				
				String line = null;
				while((line = br.readLine())!=null) {
					System.out.println("客户端说:"+line);
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	class sendThread extends Thread{
		
		@Override
		public void run() {
			super.run();
			
			try {
				if(socket!=null) {
					Scanner scanner = new Scanner(System.in);
					OutputStream out = socket.getOutputStream();
					OutputStreamWriter osw;
					BufferedWriter bw;
					PrintWriter pw;
					do {
						osw = new OutputStreamWriter(out,"UTF-8");
						bw = new BufferedWriter(osw);
						pw = new PrintWriter(bw,true);
						String line = scanner.nextLine();
						pw.println(line);
					}while(true);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		Server server = new Server();
		server.start();
	}
}

客户端

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.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端
 */
public class Client extends Thread{
	/*
	 * java.net.Socket 套接字
	 * 封装了TCP协议的通讯细节,使得我们可以通过它
	 * 来与远端计算机建立TCP连接,并利用两个流的读写
	 * 完成数据交互。
	 */
	private Socket socket;
	/**
	 * 构造方法,用来初始化客户端
	 */
	public Client() {
		try {
			/*
			 * Socket实例化是需要传入两个参数
			 * 参数1:服务端IP地址
			 * 参数2:服务端程序申请的端口
			 * 我们通过IP可以找到网络上的服务端计算机
			 * 通过端口可以连接到服务端计算机上运行的
			 * 服务端应用程序了。
			 * 注意:
			 * 实例化Socket的过程就是连接的过程,若
			 * 服务端没有响应这里会抛出异常。
			 */
			System.out.println("正在连接服务端...");
			socket = new Socket("localhost",8080);
			System.out.println("与服务端成功建立连接!");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		new sendThread().start();
		super.run();
		
		try {
			/*
			 * 通过Socket获取输入流,可以读取到远端
			 * 计算机发送过来的字节。
			 */
			InputStream in = socket.getInputStream();
			InputStreamReader isr = new InputStreamReader(in,"UTF-8");
			BufferedReader br = new BufferedReader(isr);
			
			String line = null;
			while((line = br.readLine())!=null) {
				System.out.println("服务端说:"+line);
			}
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 客户端开始工作的方法
	 */
	class sendThread extends Thread{
		@Override
		public void run() {
			super.run();
			
			try {
				Scanner scanner = new Scanner(System.in);
				/*
				 * Socket提供的方法:
				 * OutputStream getOutputStream()
				 * 该方法获取的输出流是一个字节输出流
				 * 通过这个流写出的字节会通过网络发送
				 * 到远端计算机上(对于客户端这边而言,
				 * 远端计算机指的就是服务端了。)
				 */
				OutputStream out = socket.getOutputStream();
				OutputStreamWriter osw = new OutputStreamWriter(out,"UTF-8");
				BufferedWriter bw = new BufferedWriter(osw);
				PrintWriter pw = new PrintWriter(bw,true);
				
				while(true) {
					String line = scanner.nextLine();
					pw.println(line);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		Client client = new Client();
		client.start();
	}
}

目前连接的是本地ip,要想实现两台机子的互联互通可以更换ip地址

本文地址:https://blog.csdn.net/qq_41512314/article/details/107682786