java简易的socket聊天

客户端1

发送消息给服务端并接收回复(运行程序时先运行服务端,再运行客户端)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
//客户端
public class MyClient {

	public static void main(String[] args) {
		client();
	}
	
	public static void client() {
		//通讯链路的一端是ServerSocket
				try {
					Socket socket = new Socket("localhost",5000);//(ip,端口号)
					String info = "1说最近好忙,没有出门";
					//输出流帮我发送信息
					OutputStream os = socket.getOutputStream();
					//字符串转化为字节,然后通过输出流写出去
					os.write(info.getBytes());
					socket.shutdownOutput();
					//接受回复信息
					//通过输入流获得信息
					InputStream in = socket.getInputStream();
					//把字节转化为字符,把字符读成字符串输出
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					String reply;
					while ((reply=reader.readLine())!=null) {
						System.out.println(reply);
					}
					//释放资源
					reader.close();
					in.close();
					os.close();
					socket.close();
				} catch (IOException e) {
					
					e.printStackTrace();
				}
	}
}

客户端2

同客户端1一样,同时发送信息给服务端,接收回复

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
//客户端2
public class MyClient2 {

	public static void main(String[] args) {
		client();
	}
	
	public static void client() {
		//通讯链路的一端是ServerSocket
				try {
					Socket socket = new Socket("localhost",5000);
					String info = "2说三生三世十里桃花";
					//输出流帮我发送信息
					OutputStream os = socket.getOutputStream();
					//字符串转化为字节,然后通过输出流写出去
					os.write(info.getBytes());
					socket.shutdownOutput();
					//接受回复信息
					//通过输入流获得信息
					InputStream in = socket.getInputStream();
					//把字节转化为字符,把字符读成字符串输出
					BufferedReader reader = new BufferedReader(new InputStreamReader(in));
					String reply;
					while ((reply=reader.readLine())!=null) {
						System.out.println(reply);
					}
					//释放资源
					reader.close();
					in.close();
					os.close();
					socket.close();
				} catch (IOException e) {
					
					e.printStackTrace();
				}
	}
}

服务端

死循环无限监听socket信息,每监听到一个socket就启动一个线程

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public interface MyServer {
	public static void main(String[] args) {
		server();
	}
	
	public static void server() {
		//通讯链路的一端是ServerSocket
				try {
					ServerSocket serverSocket = new ServerSocket(5000);
					//接受客户端发送过来的信息
					while (true) {
						//服务器端Socket要监听到客户端的Socket
						Socket socker = serverSocket.accept();
						//每监听到一个Socktet,就启动一个线程来处理请求
						ChatThread chatThread = new ChatThread(socker);
						chatThread.start();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
	}
}

线程类

调用线程类回复给两个客户端信息

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//1.线程类的特殊性:功能主体run() 调用时start()
public class ChatThread extends Thread{
	Socket socket = null;
	
	//构造器,构造方法,它会在别人new我的时候调用
	public ChatThread(Socket socker) {
		this.socket = socker;
	}
	
	//接受客户端请求并对请求做一个处理和响应
	public void run() {
		try {
			//通过输入流获得信息
			InputStream in = socket.getInputStream();
			//把字节转化为字符,把字符读成字符串输出
			BufferedReader reader = new BufferedReader(new InputStreamReader(in));
			String info;
			while ((info=reader.readLine())!=null) {
				System.out.println(info);
			}
			//显示客户端的ip
			InetAddress ia = socket.getInetAddress();
			String ip = ia.getHostAddress();
			System.out.println("该客户端的ip是:"+ip);
			
			//给客户端一个回复
			String repaly = "疫情期间不出";
			//输出流帮我把信息发送给对方
			OutputStream os = socket.getOutputStream();
			//字符串转化为字节,然后通过输出流写出去
			os.write(repaly.getBytes());
			//
			os.close();
			reader.close();
			in.close();
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

运行结果


客户端收到的消息
在这里插入图片描述
服务端收到的消息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java基于Socket聊天会话是一种基于TCP/IP协议的网络通信方式。它使用客户端-服务器模式,其中客户端可以向服务器发送消息并接收来自服务器的响应。 在Java中,可以使用java.net包中的Socket类来创建网络套接字,以实现与远程服务器进行通信。通过Socket类的实例,可以使用输入流和输出流来发送和接收消息。 实现基于Socket聊天会话的步骤如下: 1. 服务器端:创建一个ServerSocket对象,并绑定一个端口号,监听来自客户端的连接请求。 2. 客户端:创建一个Socket对象,并指定服务器的IP地址和端口号,与服务器建立连接。 3. 服务器端:通过ServerSocket的accept()方法接受客户端的连接请求,返回一个Socket对象,用于与客户端进行通信。 4. 客户端和服务器端都可以使用Socket对象的getInputStream()方法和getOutputStream()方法获取输入流和输出流。 5. 客户端和服务器端可以使用输入流和输出流进行数据的读取和写入,实现消息的发送和接收。 6. 当通信结束后,需要关闭输入流、输出流、Socket对象和ServerSocket对象。 基于Socket聊天会话可以实现实时通信和双向交互,适用于聊天室、在线游戏等场景。通过该方案,用户可以在不同的计算机之间进行实时的文本交流,并且可以实现多个客户端同时与服务器进行通信。 总之,基于Socket聊天会话是通过JavaSocket类实现的一种网络通信方式,它提供了客户端和服务器之间的双向通信,并可以实现实时的文本交流。 ### 回答2: Java基于Socket聊天会话是通过使用Java的网络编程API来实现的。Socket是一种在网络上进行通信的工具,它允许客户端和服务器之间建立连接并进行数据交换。 在基于Socket聊天会话中,通常有一个服务器和多个客户端。服务器绑定在一个特定的端口上,等待客户端的连接请求。一旦有客户端连接到服务器,服务器会为该客户端创建一个新的线程来处理与该客户端之间的通信。 在通信开始之前,服务器和客户端需要建立握手连接。握手过程包括服务器创建一个ServerSocket对象,并调用其accept()方法等待客户端的连接请求。客户端创建一个Socket对象,并指定服务器的IP地址和端口号来发起连接。 一旦连接建立成功,服务器与客户端可以通过输入流和输出流进行数据的读取和写入。通过输入流,服务器可以接收客户端发送过来的消息,而通过输出流,服务器可以将消息发送给客户端。同样,客户端也可以通过输入流接收服务器发送的消息,通过输出流向服务器发送消息。 在聊天会话中,服务器和客户端可以通过约定的协议来进行通信,比如发送特定命令或消息来表示不同的动作或意义。可以根据需求定义不同的协议来实现特定的功能,比如实时聊天、文件传输等。 总结起来,基于SocketJava聊天会话通过建立连接、使用输入输出流实现服务器和客户端之间的数据交换,从而实现多人实时聊天的功能。这种方式广泛应用于网络聊天、在线游戏等场景。 ### 回答3: Java基于Socket聊天会话是一种简单而又常见的网络通信方式。通过Socket,可以实现在不同计算机之间进行基于文本的实时聊天交流。 首先,需要有一个服务端和一个或多个客户端。服务端负责创建ServerSocket对象并监听指定的端口,等待客户端的连接请求。客户端通过创建Socket对象并指定服务器的IP地址和端口号来发起连接请求。 一旦客户端与服务端成功建立连接,它们就可以通过Socket的输入输出流进行数据的传输和通信。服务端可以使用ServerSocket的accept()方法接收客户端的连接请求,并将其包装为一个Socket对象,从而与客户端建立连接。 在聊天会话过程中,客户端和服务端可以通过输入输出流实现双向通信。客户端可以使用Socket的getInputStream()方法来获取服务器发送过来的消息,同时使用Socket的getOutputStream()方法发送消息给服务器。服务端可以通过Socket的getInputStream()方法来获取客户端发送过来的消息,同时使用Socket的getOutputStream()方法发送消息给客户端。 为了实现实时聊天的效果,可以使用多线程来处理多个客户端的连接。每当一个客户端连接成功后,服务端就会为该客户端创建一个独立的线程,负责处理该客户端的聊天消息。 总结起来,Java基于Socket聊天会话是通过服务端和客户端之间的Socket连接来实现的。通过读写Socket的输入输出流,可以在不同计算机之间进行实时的的文本聊天交流。使用多线程可以实现多个客户端的同时连接和处理,从而实现更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值