Java使用TCP套接字实现多人聊天功能详解
作者:hu_beliefs 发布时间:2023-12-16 15:42:40
标签:Java,TCP套接字,多人聊天
本文实例讲述了Java使用TCP套接字实现多人聊天功能。分享给大家供大家参考,具体如下:
废话不多说,直接开搞:
先创建一个服务端:
package interWebWriterEven2;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
/**
* 服务端
* @author
*
*/
public class ServiceT {
static ArrayList<Socket> list = new ArrayList<Socket>();
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(9999);
while(true){
Socket socket = server.accept();
System.out.println(socket.getInetAddress().getHostName()+"连接成功。IP:"+socket.getInetAddress().getHostAddress());
list.add(socket);
ServiceThreadT t =new ServiceThreadT(socket);
t.start();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
接着是服务端的线程:
package interWebWriterEven2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
/**
* 服务端线程
* @author
*
*/
public class ServiceThreadT extends Thread{
private Socket socket;
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public ServiceThreadT(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
try {
@SuppressWarnings("resource")
BufferedWriter wFile = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("D://messagesT.txt",true)));
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String strOut = "";
String strIn = "";
while(true){
strIn = socket.getInetAddress().getHostName()+":"+br.readLine();
strOut = strIn;
wFile.write(strIn);
wFile.newLine();
wFile.flush();
for (Socket soc : ServiceT.list) {
if(soc != socket){
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(soc.getOutputStream()));
bw.write(strOut);
System.out.println(strOut);
bw.newLine();
bw.flush();
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后是客户端(应用端):
package interWebWriterEven2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 客户端
* @author
*
*/
public class ClientT {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1",9999);
ClientThreadT t = new ClientThreadT(socket);
t.start();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String strIn = "";
while(true){
strIn = br.readLine();
System.out.println(strIn);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
最后是客户端的线程:
package interWebWriterEven2;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;
/**
* 客户端的线程
* @author
*
*/
public class ClientThreadT extends Thread{
private Socket socket;
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public ClientThreadT(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
try {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
while(true){
System.out.println();
bw.write(sc.nextLine().trim());
bw.newLine();
bw.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
先运行服务端哦,否则将会报空指针异常的。
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/hu_belif/article/details/81675911


猜你喜欢
- private void btnSave_Click(object sender, RoutedEventArgs e)
- 引言在Android应用中,列表有着举足轻重的地位,几乎所有的应用都有列表的身影,但是对于列表的交互体验一直是一个大问题。在性能比较好的设备
- 前言在 App 开发过程中,ListView 是 比较很常见的控件,用来处理 列表类的数据展示。当然 Flutter 也是支持的,由于 Fl
- 问题:在Spring Boot中使用JpaRepository的deleteById(ID id)方法删除数据时,首先要使用existsBy
- 背景环境已学习java基础,html,css,js,jquery,bootstrap,layui,maven,servlet和jsp,刚进入
- 《Spring Boot Actuator详解与深入应用》预计包括三篇,第一篇重点讲Spring Boot Actuator 1.x的应用与
- SurfaceViewSurfaceView从源码上看继承自View,但在内部实现上SurfaceView和其他View有很多区别。 Sur
- 具体代码如下所示:import java.util.ArrayList;import java.util.List;import java.
- 本文这个实例通过前面学过的Paint、Canvas等2D绘画技术来实现一个简单的Android的绘图板。具体实现代码:创建一个名为DrawV
- 本文实例讲述了Android编程实现AlertDialog自定义弹出对话框的方法。分享给大家供大家参考,具体如下:弹出对话框,显示自定义的布
- 自定义单元格表示值通过CellFormatting事件,可以自定义单元格的表示值。(比如:值为Error的时候,单元格被设定为红色)示例:p
- SwipeRefreshLayout是Android官方的下拉刷新控件,使用简单,界面美观,不熟悉的朋友可以随便搜索了解一下,这里就不废话了
- 现在很多网站都有注册登录的页面,为了更好的满足用户体验和网站的安全性,很多网站都采用动态生成的图形码或者是附加码进行验证,下面把生成验证码的
- 目录前言hibernate-validator基本使用引入依赖编写需要验证对象验证对象属性是否符合要求验证规则空/非空验证bool时间数学字
- 自己定义的栈的接口,完全是按照栈的常用方法以及命名方式实现: 注意以下类,接口都是在一个命名空间下栈的接口:包括了常用的方法namespac
- 重写addResourceHandlers映射文件路径在看一个博客源码发现页面的图片所映射的地址在SpringBoot静态资源文件夹下找不到
- 我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面。要实现访问控制的方法多种多样,可以通
- 日期和时间,在我们开发中非常重要。DateTime在C#中,专门用来表达和处理日期和时间。本文算是多年使用DateTime的一个总结,包括D
- 本文实例为大家分享了MVPXlistView上拉下拉展示的具体代码,供大家参考,具体内容如下抽基类package com.gs.gg.day
- 前言为什么要学SpringBoot和Mybatis呢,我觉得作为一个合格的后端程序员增删改查(CRUD)肯定是要会的,而且是最基本的一项技能