`
lucane
  • 浏览: 119054 次
  • 性别: Icon_minigender_1
  • 来自: 江湖
社区版块
存档分类
最新评论

Socket多线程练习

阅读更多
这个程序现在来看简直就是弱爆了。。。勿看,没有参考价值

写一个socket,多线程相关的练习。
就是经典的客户端服务器聊天例子啦
看了一些写法,也不知道哪个是对的

在服务器端维护了一个请求list,每个客户端的请求服务器端新起一个Thread

当客户端退出时将该thread从list中去除

该什么时候去删除,怎么去删除。。。不会了

请各位指点下,谢谢了

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.BindException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ChatServer {

	List<Client> clients = new ArrayList<Client>();

	public static void main(String[] args) {
		new ChatServer().start();
	}

	public void start() {
		boolean started = false;
		ServerSocket ss = null;
		try {
			ss = new ServerSocket(8888);
			started = true;
		} catch (BindException e) {
			System.out.println("端口正在被使用,请关闭相应程序!");
			System.exit(0);
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			while (started) {
				Socket s = ss.accept();
				Client c = new Client(s);
				clients.add(c);
				System.out.println("a client connected!");
				new Thread(c).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				ss.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 每个请求过来启用一个线程来处理<br>
	 */
	private class Client implements Runnable {
		Socket socket = null;
		DataInputStream dis = null;
		DataOutputStream dos = null;
		boolean connected = false;

		Client(Socket s) {
			try {
				this.socket = s;
				dis = new DataInputStream(s.getInputStream());
				dos = new DataOutputStream(s.getOutputStream());
				connected = true;
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		public void run() {
			while (connected) {
				try {
					Iterator<Client> it = clients.iterator();
					String msg = dis.readUTF();
					while (it.hasNext()) {
						Client c = it.next();
						c.send(msg);
					}

				} catch (EOFException eof) {
					connected = false;
					// 需要在序列中将退出的client去除,
					// 迭代过程中
					// 不能使用Collection本身的remove方法,
					// 会抛出java.util.ConcurrentModificationException
					// 使用iterator的remove方法
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		private void send(String str) throws IOException {
			dos.writeUTF(str);
		}
	}
}
分享到:
评论
2 楼 lucane 2009-05-10  
Blithe 写道

在出异常的时候把时候把他删了clients.remove(s);

应该是出异常的时候删,但我这里删了报错
我看有些人list里面放的是Socket,我放的是Client
这个有影响吗
1 楼 Blithe 2009-05-05  
在出异常的时候把时候把他删了
clients.remove(s);

相关推荐

    socket 多线程 练习的例子

    socket 多线程 练习的例子 没事还得多看看

    练习\Socket和多线程编程的聊天程序实现

    练习\Socket和多线程编程的聊天程序实现

    python socket多线程通讯实例分析(聊天室)

    本文实例讲述了python socket多线程通讯方法。分享给大家供大家参考,具体如下: #!/usr/bin/evn python """ 这是一个Socket+多进程的例子(聊天服务端) """ import socket import threading # 处理中文数据用的 ...

    用Python语言实现多线程客户端与服务端的对话程序

    一、程序功能可以实现多台电脑互通消息,且利用多线程实现一台服务器与多台客户端的连续对话二、关键代码块主要模块socket与threading1.客户端实现:socket.connect(),socket.send(),socket.recv()2.服务器实现:...

    带游戏大厅的中国象棋 C# 实现多线程,事件委托

    学习C#form的时候编写的简单小程序,不算成熟不能用于商业,对于多线程,事件,网络编程,socket编程练习非常有帮助

    C++ Socket 控制台聊天工具源码

    一个很好的练习Socket和多线程编程的例子,通过Socket,一个线程用于接收消息,另一个用于回复消息, 分为Server 和Customer 端!

    Math Server 算术多线程并发服务器

    一个简单Java Socket,multi-thread 的练习。是上学时的作业。 服务器实现了多线程并发处理来自客户端的算术请求。 初学套接字编程 和 多线程编程的可以看看。 请用jdk1.6以上。

    C# Socket Tcp文件传输和文字聊天系统

    在研究C#IM的过程中,循序渐进的学习和研究C#网络编程,写成了本C#异步多线程文件传输和文字聊天系统,对刚刚学习网络编程的人有一定的帮助,因为是练习作品,所以请大家莫拍砖。

    基于java Swing 框架使用socket技术开发的即时通讯系统【源码+数据库】

    本项目是一套基于java Swing 框架使用socket技术开发的即时通讯系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 ...

    linux下基于socket tcp 的答题系统

    我自己练习用的LINUX的习题问答程序。软件尚有bug,但是90%可用。...主要使用socket、tcp、多进程、多线程、IO以及sqlite3的练习。client.C中需要自己设定配置本机的IP。可以自行扩充数据库,修改代码。

    linux c++线程

    本人主要想练习一下socket c++ 多线程编程, 这个项目想要实现的工能是:这是一个服务器,运行先等待 client的连接,当有 client连接,服务器创建一个线程!主线程是还是等待 client发送的信息,创建的线程也是做...

    java网络编程——网络版题库程序

    java网络编程——网络版题库程序(主要技术java+socket+多线程+mysql),程序是C/S 版本的,由于服务器端是java写的,所有客户端使用android也是很容易与服务器对接的

    Java项目练习之聊天室(包含说明文档及源代码)

    能够完成多线程的用户聊天程序。 三、 实现技术 a) 使用ServerSocket、Socket完成服务端和客户端的连接。 b) 服务端使用多线程的方式可以接受多个客户端。 c) 使用对象的方式,在服务端和客户端之间传送数据。

    java聊天室

    java聊天室,采用socket,支持多人聊天,多线程练习代码,初学者学习适用

    java多线程tcpsocketserver源码-Code:代码

    java多线程tcp socket server源码该文件夹包含许多不同的子文件夹,其中存储了我在学习期间一直在进行的各种项目。 有我在 SAP Labs France 的 6 个月实习、Eurecom 学期项目、练习以及与不同编程语言的软件开发相关...

    java写的一个简单基于tcp协议的多用户聊天系统

    用j2se写的一个简单的聊天系统,写了客户端和服务器。用到了socket,流读写技术,服务器端采用了多线程等技术。基本上涵盖了j2se中所有学到的技术,非常适合学习了j2se的初学者练习使用。

    JAVA语言实现的聊天室程序(达内项目).rar

    能够完成多线程的用户聊天程序。 三、 实现技术 a) 使用ServerSocket、Socket完成服务端和客户端的连接。 b) 服务端使用多线程的方式可以接受多个客户端。 c) 使用对象的方式,在服务端和客户端之间传送数据。

    Socket 聊天室

    刚刚才学的Socket技术,借鉴了不少大神的博客和源码,然后自己试着做了一个练习,虽然还有很多不完善的地方,但是最基本的应用还算马马虎虎。

    中山大学计算机网络实验及计网练习题.rar

    3 多人聊天编程实验(Chat 实验) 套接字(Socket)的多线程编程方法 4 应用层实验 HTTP、FTP、SMTP、POP3 等协议的使用 5 文件传输实验 学习利用套接字传送文件 1 二层交换机实验 掌握二层交换机的基本配置和使用...

Global site tag (gtag.js) - Google Analytics