`
lucane
  • 浏览: 121687 次
  • 性别: 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多线程练习的例子"中,我们可能涉及到以下知识点: 1. **Socket基础知识**:Socket是网络编程中的接口,它提供了一种在网络中不同计算机间进行数据传输的方式。Socket分为流式套接字(TCP)和数据报套接字...

    socket linux c++ 多线程3

    最后,"多线程.rar"可能包含更多关于多线程编程的示例和练习,帮助读者深入理解和实践这一主题。 总的来说,结合C++、Linux和多线程的Socket编程,可以构建出强大的网络服务应用。通过学习和实践提供的各种资源,...

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

    2. **多线程编程**:在聊天程序中,多线程技术是必需的,因为它允许服务器同时处理多个客户端的连接请求。每个客户端连接都会创建一个新的线程来处理,这样就不会阻塞其他客户端的请求。Java中的`Thread`类和`...

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

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

    socket TCP 简单练习

    此外,还可以学习到异常处理、多线程等概念,因为实际应用中可能需要处理并发连接或错误情况。 总的来说,掌握Socket TCP编程能力是成为一名合格的IT专业人员的必备技能之一,它能够帮助你构建各种网络应用,如聊天...

    《实战 Linux Socket编程》练习代码

    可能还会涉及到多线程或多进程模型处理并发连接,比如使用fork()或epoll()进行I/O复用。 4. **客户端编程**:客户端通常会使用connect()函数连接到服务器,然后通过send()和recv()进行数据交换。学习者可能会遇到...

    多线程与socket网络编程-内附视频链接-新手入门资料

    在IT领域,多线程和Socket网络编程是两个至关重要的概念,它们对于开发高效、可靠的分布式系统至关重要。这里我们将深入探讨这两个主题。 1. **进程** - **进程的定义**:进程是操作系统中资源分配的基本单位,它...

    基于UDP、TCP、多线程的socket编程

    在这个项目中,我们专注于使用UDP、TCP和多线程技术来实现Socket通信,这些都是Linux高级编程中的重要概念。 首先,UDP(User Datagram Protocol)是一种无连接的协议,它提供了不可靠的数据传输服务。在UDP通信中...

    socket UDP 简单练习

    5. **多线程处理**:在服务器端,可能需要使用多线程来处理来自多个客户端的并发请求。 6. **端口和IP解析**:理解如何使用`inet_pton()`和`inet_ntop()`进行IP地址和端口的字符串与二进制格式之间的转换。 在实际...

    多线程研究练习

    在进行多线程研究练习时,可以尝试构建不同的并发场景,模拟数据竞争、死锁等问题,然后使用相应的同步机制和工具进行解决。同时,理解异步编程和线程池的使用,有助于编写出更加高效和响应迅速的代码。

    武汉理工大学Java多线程实验源码

    这些可能是按照课程进度逐步进阶的多线程实验,每个实验可能包含一个或多个Java类,用于演示和练习不同的多线程技术。例如,CTExp01可能涉及线程的基本创建和启动,CTExp03可能涉及到线程同步和互斥,而CTExp06和...

    练习多线程客户端与服务器端

    在这个"练习多线程客户端与服务器端"的例子中,我们将深入探讨如何在客户端和服务器端使用多线程来提高程序的效率和响应性。 首先,让我们理解客户端和服务器端的基本概念。客户端是发起请求的程序,而服务器端则是...

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

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

    java 多线程超市(员工、货物)管理系统

    虽然这种方式不如图形用户界面(GUI)直观,但它对于理解和学习多线程、网络通信等核心概念非常有利,而且开发成本较低,适合初学者练习。 此外,系统的需求分析是项目开始前的重要步骤。《超市管理系统需求分析....

    简单的多线程服务器

    这里的“简单的多线程服务器”示例可能是一个基础的网络编程练习,它利用了多线程技术来提升服务效率,同时提供了同步IO和异步IO两种操作模式。接下来,我们将深入探讨相关知识点。 首先,多线程是操作系统并发执行...

    JAVA课件(高级程序设计,socket编程,图形界面,多线程)

    在Java编程领域,掌握高级程序设计、Socket编程、图形用户界面(GUI)设计以及多线程是成为专业开发者的必备技能。以下是对这些关键知识点的深入解析: **高级程序设计**: Java作为一门面向对象的语言,其高级特性...

    java(简易)多线程HTTP服务器

    在Java编程领域,构建一个简易的多线程HTTP服务器是一项常见的练习,这有助于理解网络通信、线程管理和HTTP协议的基本原理。在这个项目中,我们利用Java的线程池和Socket库来实现这样一个服务器,它支持GET、POST...

    多线程端口扫描器(含源代码)

    标题中的“多线程端口扫描器”是一个网络工具,用于探测远程或本地主机的开放端口。在计算机网络中,端口是TCP/IP协议的一部分,用于标识在特定IP地址上运行的不同服务。多线程技术的应用使得扫描过程可以同时进行多...

Global site tag (gtag.js) - Google Analytics