网络编程多人聊天c语言,socket网络编程--简单的多人聊天
//本代码参考于马士兵的代码,做了一些简单的改动,例如获取主机名称好让用户知道那句话是谁发的,Swing方面基本上全改了,关键地方加了我所理解的注释,关键线程方面的代码基本上用马老师的
//服务器端代码
import java.awt.FlowLayout;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class QLServer extends JFrame{
public JTextArea jtextarea = null;
public void lanuchFrame(String str){
this.setName(str);
init();
}
private void init() {
setLayout(new FlowLayout());
jtextarea =new JTextArea(20, 17);
jtextarea.setLineWrap(true);
jtextarea.setEditable(false);
this.getContentPane().add(new JScrollPane(jtextarea));
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200,400);
setLocationRelativeTo(null);
setResizable(false);
}
ServerSocket server = null;
Collection cClients = new ArrayList();//加个泛型
public void startServer() throws IOException{
while(true){
Socket s = server.accept();
cClients.add(new ClientConn(s));
jtextarea.append("new client login" + s.getInetAddress() + ":" + s.getPort()+"\n");
}
}
public QLServer(int port,String str) throws IOException{
server = new ServerSocket(port);
lanuchFrame(str);
}
class ClientConn implements Runnable
{
Socket s = null;
public ClientConn(Socket s)
{
this.s = s;
(new Thread(this)).start();
}
public void send(String str) throws IOException
{
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
}
public void dispose()//客户端下线
{
try {
if (s != null) s.close();
cClients.remove(this);
jtextarea.append("A client out! \n");
jtextarea.append("client count: " + cClients.size() + "\n\n");
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void run()
{
try {
DataInputStream dis = new DataInputStream(s.getInputStream());
String str = dis.readUTF();
while(str != null && str.length() !=0)
{
System.out.println(str);
for(Iterator it = cClients.iterator(); it.hasNext(); )
{
ClientConn cc = (ClientConn)it.next();
if(this != cc)
{
cc.send(str+" "+s.getInetAddress().getHostName());
}
}
str = dis.readUTF();//少了这句话会无限输出
//send(str);
}
this.dispose();
}
catch (Exception e)
{
this.dispose();
}
}
}
public static void main(String[] args) {
try {
QLServer qlserver = new QLServer(8888,"QLServer");
qlserver.startServer();
} catch (IOException e) {
e.printStackTrace();
}
}
}===============================
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
//客户端代码
public class QLClient extends JFrame implements ActionListener{
public JTextArea jtextarea1 = null;
public JTextArea jtextarea2 = null;
public JButton button = null;
Socket s =null;
public void launchFrame(String str){
this.setName(str);
init();
}
public QLClient(String str) throws IOException{
launchFrame(str);
s = new Socket("127.0.0.1",8888);//哪台电脑做服务器,IP地址改成那台机子的IP
(new Thread(new ServeConn())).start();
}
private void init() {
setLayout(new FlowLayout());
jtextarea1 =new JTextArea(17, 16);
jtextarea2 =new JTextArea(4, 16);
jtextarea1.setLineWrap(true);
jtextarea1.setEditable(false);
jtextarea2.setLineWrap(true);
button = new JButton("发送");
button.addActionListener(this);//绑定button事件
this.getContentPane().add(new JScrollPane(jtextarea1));
this.getContentPane().add(new JScrollPane(jtextarea2));
add(button);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200,470);
setLocationRelativeTo(null);
setResizable(false);
}
public void send(String str) throws IOException{
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(str);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button){
String sendStr = jtextarea2.getText();
if(sendStr.trim().length()==0){
return;
}
try {
this.send(sendStr);
jtextarea2.setText("");
InetAddress a;
a = InetAddress.getLocalHost();
String hostname = a.getHostName();
jtextarea1.append(sendStr+"("+hostname+")"+"\n");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
class ServeConn implements Runnable{
public void run() {
if(s == null) return;
try {
DataInputStream dis = new DataInputStream(s.getInputStream());
String str = dis.readUTF();
while (str != null && str.length() != 0)
{
//System.out.println(str);
QLClient.this.jtextarea1.append(str + "\n");//内部类用外类中的变量或方法加外类名
str = dis.readUTF();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
//main主函数入口
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
QLClient qlclient = new QLClient("QLClient");
String str = br.readLine();
while(str!=null&&str.length()!=0){
qlclient.send(str);
str = br.readLine();//防止死循环
}
qlclient.s.close();
}
} 以上代码供参考,关于异常基本上没有处理,所以操作顺序不对可能会出现异常。
网络编程多人聊天c语言,socket网络编程--简单的多人聊天相关推荐
- 编程题目:使用C++语言模拟完成一个简单的计算机系统
编程题目:使用C++语言模拟完成一个简单的计算机系统(举一个管理人员的例子,其他的例子与下述方法一致即可) #include<iostream.h> #include<math.h& ...
- 5.3linux下C语言socket网络编程简例
原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
- python网络编程讲解_详解Python Socket网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- 使用java socket实现一个简单的一对多聊天室
socket就是指两个应用程序之间通信的抽象对象,我们可以使用socket实现网络应用程序.例如一个多人聊天室. 目录 先从服务端开始 创建一个窗口类 创建一些方法,用于管理服务端链接,或者进行消息的 ...
- c语言二级编程题库,二级C语言题库-编程题.doc
二级C语言题库-编程题 第 PAGE \* Arabic \* MERGEFORMAT 27 页第 PAGE \* Arabic \* MERGEFORMAT 27 页 1.请编写函数fun,其功能是 ...
- 浙大 java语言程序设计编程答案,浙大《Java语言程序设计》编程答案4
浙大<Java语言程序设计>编程答案4 实验5 分支结构程序的设计程序填空,不要改变与输入输出有关的语句.一.显示两级成绩 输入一个正整数repeat (0b) min=b;if(minc ...
- C语言多人聊天室,Socket网络编程
多人聊天室,Windows黑窗口 两个程序:service和client 需要先启动service,再启动client输入IP. 实现步骤 service: 先创建一个listen 循环去监听连接请求 ...
- 简易QQ聊天室,socket多线程编程(C语言实现),简单易懂
简易QQ聊天室 实现本功能,仅需了解socket套接字的使用,我已经将socket套接字的监听接受状态封装在了common.c中,相信你看了会有所收获,socket的连接也封装在common.c中. ...
最新文章
- LeetCode Permutation Sequence(求排列中的第k个排列是什么)
- Centos7安装mongo3.4
- 【洛谷】选数---深度优先搜索+单调不降去重
- wordpress 模板中的链接_WordPress 官方AMP插件已更新至2.0版
- JZOJ 5406. 【NOIP2017提高A组模拟10.10】Tree
- javaweb项目部署到tomcat之后java文件没有编译
- PgSQL · 案例分享 · PostgreSQL+HybridDB解决企业TP+AP混合需求
- HTML5 Canvas专题
- 【Java】多线程编程
- win11怎么安装安卓app win11上安装安卓app的步骤教程
- 转,python的匿名函数lambda解释及用法
- Python 自定义模块
- python绘制箱线图-python绘制箱线图
- 事物运动的状态和方式是谁提出的_为什么信息是事物运动的状态和方式??
- 数值分析(9):数值积分之Newton-Cotes求积公式和复合求积公式
- 计算机主板北桥芯片的主要作用,介绍一下南北桥芯片的位置及作用
- 英语后置定语语法归纳
- Stop worrying and start living
- css3 flex 省略号,142.关于flex布局与省略号不显示的问题
- An error occurred while filtering resources
热门文章
- Q84:层级实例网格[Hierarchical Instance Grids]
- 问题四十六:怎么用ray tracing画superellipsoid
- Python思维导图框架总结
- Hadoop入门(1)
- 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
- python源文件的执行方式_python源程序执行的方式有哪几种
- shiro 同时实现url和按钮的拦截_Shiro权限管理框架(一):Shiro的基本使用
- linux7保存防火墙规则,centos7中没有service iptables save指令来保存防火墙规则
- 免费的html空间,免费HTML网页空间(每月200 GB 流量托管静态网页超简单)
- 手势识别器GestureDetector