Java编程实现基于TCP协议的Socket聊天室示例
作者:fearlessMore 发布时间:2023-02-17 17:23:13
标签:Java,TCP协议,Socket聊天室
本文实例讲述了Java编程实现基于TCP协议的Socket聊天室。分享给大家供大家参考,具体如下:
这里使用Socket套接字进行编程,完成的是基于TCP可靠服务实现服务器与客户端的双通信。
Server服务器端:
package com.han;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.net.*;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
/**
* 本程序实现了一个TCP程序的服务器编程部分。
* 使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与客户端的双通信。
* 客户端的编程见本包中的类Client
* @author HAN
*
*/
@SuppressWarnings("serial")
public class Server extends JDialog{
private BufferedReader reader;
private PrintWriter writer;
private ServerSocket server;
private Socket socket;
private JTextArea ta=new JTextArea();
private JScrollPane sp=new JScrollPane(ta);
private JTextField tf=new JTextField();
Container cc;
public Server(String title) {
setTitle(title);
addWindowListener(new WindowAdapter() {
public void windowClosing (WindowEvent we) {
dispose(); //撤销dialog一切相关资源
System.exit(0); //正常退出程序
}
});
cc=getContentPane();
setLayout(null);
ta.setLineWrap(true);
ta.setEditable(false);
sp.setBounds(0,0,300,342);
tf.setBounds(0,342,300,25);
cc.add(sp);
cc.add(tf);
tf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
try {
writer=new PrintWriter(socket.getOutputStream(),true);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
writer.println(tf.getText());
ta.append("User1:"+tf.getText()+'\n');
tf.setText("");
}
});
}
void getserver(){
try{
server=new ServerSocket(8998);
ta.append("服务器套接字已经创建成功\n");
while(true){
ta.append("等待客户机的连接\n");
socket=server.accept();
ta.append("客户机已连接\n");
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
getClientMessage();
}
}catch(Exception e){
e.printStackTrace();
}
}
private void getClientMessage(){
try {
while(true){
String news=reader.readLine();
if(news!=null){
ta.append("User2:"+news+"\n");
}else{
ta.append("User2(客户端) 已断开链接\n");
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
if(reader!=null){
reader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Server user1=new Server("User1");
user1.setBounds(0,0,300,400);
user1.setResizable(false);
user1.setVisible(true);
user1.getserver();
}
}
Client客户端:
package com.han;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
/**
* 本程序实现了一个TCP程序的客户端编程部分。
* 使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与服务器的双通信。
* 服务器的编程见本包中的类Server
* 可以在不同的平台与不同的机器上运行,只是要把代码中写的IP地址修改为运行服务器程序Server的机器的IP地址。
* @author HAN
*
*/
@SuppressWarnings("serial")
public class Client extends JDialog{
private BufferedReader reader;
private PrintWriter writer;
private Socket socket;
private JTextArea ta=new JTextArea();
private JScrollPane sp=new JScrollPane(ta);
private JTextField tf=new JTextField();
Container cc;
public Client(String title) {
setTitle(title);
addWindowListener(new WindowAdapter() {
public void windowClosing (WindowEvent we) {
dispose(); //撤销dialog一切相关资源
System.exit(0); //正常退出程序
}
});
cc=getContentPane();
setLayout(null);
ta.setLineWrap(true);
ta.setEditable(false);
sp.setBounds(0,0,300,342);
tf.setBounds(0,342,300,25);
cc.add(sp);
cc.add(tf);
tf.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
writer.println(tf.getText());
ta.append("User2:"+tf.getText()+'\n');
tf.setText("");
}
});
}
private void connect(){
ta.append("尝试连接\n");
try {
socket=new Socket("192.168.1.3",8998);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
writer=new PrintWriter(socket.getOutputStream(),true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ta.append("完成连接\n");
}
private void getClientMessage(){
try {
reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String news=reader.readLine();
if(news!=null){
ta.append("User1:"+news+"\n");
}else{
ta.append("User1(服务器) 已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n");
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
ta.append("User1(服务器) 已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n");
e.printStackTrace();
}
try{
if(reader!=null){
reader.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client user2=new Client("User2");
user2.setBounds(0,0,300,400);
user2.setVisible(true);
user2.setResizable(false);
user2.connect();
user2.getClientMessage();
}
}
希望本文所述对大家java程序设计有所帮助。
来源:http://blog.csdn.net/gaowen_han/article/details/7163709


猜你喜欢
- MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效
- 如下所示:JSONArray jsonArray1 = jsonObject.getJSONArray("result"
- 本文实例讲述了Java统计字符串中字符出现次数的方法。分享给大家供大家参考,具体如下:package com.wenzhi;import j
- for循环和foreach循环其实可以算得上是从属关系的,即foreach循环是可以转化成for循环,但是for循环不一定能转换成forea
- java LRU(Least Recently Used )详解LRU是Least Recently Used 的缩写,翻译过来就是“最近最
- 一、字符串:1、访问String中的字符:string本身可看作一个Char数组。string s = "hello world&
- 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代
- 前言:我们每天都在编写Java代码,编译,执行。很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.cl
- 简述SpringBoot对Spring的的使用做了全面的封装,使用SpringBoot大大加快了开发进程,但是如果不了解Spring的特性,
- 问题(1)条件锁是什么?(2)条件锁适用于什么场景?(3)条件锁的await()是在其它线程signal()的时候唤醒的吗?简介条件锁,是指
- 面向过程和面向对象的区别面向过程:当事件比较简单的时候,利用面向过程,注重的是事件的具体步骤和过程,注重的是过程中的具体行为,以函数为最小单
- 一、判断语句最常用的顺序结构只能顺序执行,并不能进行判断和选择。于是便有了下面两种分支结构if语句switch语句1. if语句一个if语句
- 介绍随着当今处理器中可用的核心数量的增加, 随着对实现更高吞吐量的需求的不断增长,多线程 API 变得非常流行。 Java 提供了自己的多线
- 公司有一个需求,实现一个多级的树形菜单,并且支持多选功能,实现这个功能之前,我在网上找了找,树形菜单很好找,但是支持多选功能并没有很合适的,
- 本文实例讲述了java实现切割wav音频文件的方法。分享给大家供大家参考,具体如下:import it.sauronsoftware.jav
- mybatis-plus 3.0.1 枚举返回为null解决办法2020-11-02 14:28:48今天再次回到代码里无意间看到,原来和m
- 添加NuGet包选择最新版就好了安装完成后右键项目重新生成方案使用OpenCvSharp.CPlusPlus命名空间using OpenCv
- 本文实例为大家分享了Java实现二分查找的变种,供大家参考,具体内容如下普通二分查找:先回顾一下普通的二分查找注意:二分查找有这样一个问题:
- 前言1.因为涉及到对象锁,Wait、Notify一定要在synchronized里面进行使用。2.Wait必须暂定当前正在执行的线程,并释放
- 本文实例讲述了Android解析Intent Filter的方法。分享给大家供大家参考。具体分析如下:匿名性质的运行时绑定使得理解Andro