//本代码参考于马士兵的代码,做了一些简单的改动,例如获取主机名称好让用户知道那句话是谁发的,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网络编程--简单的多人聊天相关推荐

  1. 编程题目:使用C++语言模拟完成一个简单的计算机系统

    编程题目:使用C++语言模拟完成一个简单的计算机系统(举一个管理人员的例子,其他的例子与下述方法一致即可) #include<iostream.h> #include<math.h& ...

  2. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  3. linux下C语言socket网络编程简例

    转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...

  4. python网络编程讲解_详解Python Socket网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  5. 使用java socket实现一个简单的一对多聊天室

    socket就是指两个应用程序之间通信的抽象对象,我们可以使用socket实现网络应用程序.例如一个多人聊天室. 目录 先从服务端开始 创建一个窗口类 创建一些方法,用于管理服务端链接,或者进行消息的 ...

  6. c语言二级编程题库,二级C语言题库-编程题.doc

    二级C语言题库-编程题 第 PAGE \* Arabic \* MERGEFORMAT 27 页第 PAGE \* Arabic \* MERGEFORMAT 27 页 1.请编写函数fun,其功能是 ...

  7. 浙大 java语言程序设计编程答案,浙大《Java语言程序设计》编程答案4

    浙大<Java语言程序设计>编程答案4 实验5 分支结构程序的设计程序填空,不要改变与输入输出有关的语句.一.显示两级成绩 输入一个正整数repeat (0b) min=b;if(minc ...

  8. C语言多人聊天室,Socket网络编程

    多人聊天室,Windows黑窗口 两个程序:service和client 需要先启动service,再启动client输入IP. 实现步骤 service: 先创建一个listen 循环去监听连接请求 ...

  9. 简易QQ聊天室,socket多线程编程(C语言实现),简单易懂

    简易QQ聊天室 实现本功能,仅需了解socket套接字的使用,我已经将socket套接字的监听接受状态封装在了common.c中,相信你看了会有所收获,socket的连接也封装在common.c中. ...

最新文章

  1. LeetCode Permutation Sequence(求排列中的第k个排列是什么)
  2. Centos7安装mongo3.4
  3. 【洛谷】选数---深度优先搜索+单调不降去重
  4. wordpress 模板中的链接_WordPress 官方AMP插件已更新至2.0版
  5. JZOJ 5406. 【NOIP2017提高A组模拟10.10】Tree
  6. javaweb项目部署到tomcat之后java文件没有编译
  7. PgSQL · 案例分享 · PostgreSQL+HybridDB解决企业TP+AP混合需求
  8. HTML5 Canvas专题
  9. 【Java】多线程编程
  10. win11怎么安装安卓app win11上安装安卓app的步骤教程
  11. 转,python的匿名函数lambda解释及用法
  12. Python 自定义模块
  13. python绘制箱线图-python绘制箱线图
  14. 事物运动的状态和方式是谁提出的_为什么信息是事物运动的状态和方式??
  15. 数值分析(9):数值积分之Newton-Cotes求积公式和复合求积公式
  16. 计算机主板北桥芯片的主要作用,介绍一下南北桥芯片的位置及作用
  17. 英语后置定语语法归纳
  18. Stop worrying and start living
  19. css3 flex 省略号,142.关于flex布局与省略号不显示的问题
  20. An error occurred while filtering resources

热门文章

  1. Q84:层级实例网格[Hierarchical Instance Grids]
  2. 问题四十六:怎么用ray tracing画superellipsoid
  3. Python思维导图框架总结
  4. Hadoop入门(1)
  5. 郴州大数据产业招商会在深举行,中琛源科技签约智慧水务项目
  6. python源文件的执行方式_python源程序执行的方式有哪几种
  7. shiro 同时实现url和按钮的拦截_Shiro权限管理框架(一):Shiro的基本使用
  8. linux7保存防火墙规则,centos7中没有service iptables save指令来保存防火墙规则
  9. 免费的html空间,免费HTML网页空间(每月200 GB 流量托管静态网页超简单)
  10. 手势识别器GestureDetector