`
xiang37
  • 浏览: 430224 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

多线程、socket、全局静态变量、聊天室

阅读更多

在学习了,多线程和socket之后;就想实现这个功能;但是一直没有花时间去写。可能我学得比较杂吧。

 

本程序虽然不是很完善,但是基本要求达到了。

功能:实现多个人同时聊天。类似于群聊天室

 

 

package com.xiva.bean;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class SocketServer {
	public static List<Socket> socketList = new ArrayList<Socket>();
	public static int number = 0;
	public static void main(String[] args) {

		try{
					//绑定服务端在8080端口
			ServerSocket server = new ServerSocket(8080);
			Socket socket;
			int count = 0;
			
			while (true) {
				
				//监听客户端程序
				socket = server.accept();
				count = count + 1;
				
				System.out.println(socket.getInetAddress().getHostAddress());
				
				//一个客户端连接后启动一个线程进行监听客户端消息
				
				ReadThread readThread = new ReadThread(socket);
				readThread.start();
				
				socketList.add(socket);
			}
		} catch(IOException e){
			e.printStackTrace();
		}
	}
}

class ThreadSocketServer extends Thread {

	Socket server;
	
	public ThreadSocketServer(){
		
	}
	
	public ThreadSocketServer(Socket s) {
		this.server = s;
	}
	
	public void run() {
		try {
			
			BufferedReader br = new BufferedReader(new InputStreamReader(
					System.in));
			PrintWriter pw = new PrintWriter(server.getOutputStream());
			
			//循环发送信息给客户端
			while (true) {
				String s = br.readLine();
				pw.println(s);
				pw.flush();
				System.out.println("Server:" + s);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

class ReadThread extends Thread {

	private Socket socket;
	public ReadThread(Socket socket){
		this.socket = socket;
	}
    public void run() {
		try {
			BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			String read=new String();
			
			//循环接受客户端信息
			while(true)
			{
				
				read=br.readLine();
				System.out.println(socket.getInetAddress().getHostAddress() +"client说:"+read);
				ArrayList<Socket> socketList = SocketServer.socketList;
				for(int i = 0; i < socketList.size(); i ++){
					Socket socket = socketList.get(i);
					PrintWriter pw = new PrintWriter(socket.getOutputStream());
					pw.println(read);
					pw.flush();
				}
				
				if(read.equals("bye"))
				{
					break;
				}
			}
			br.close();
			socket.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

 

不用说了上面是socket的server端。

标题中提到了,全局静态变量;就是上面程序中的socketList。用来存储每一个连接到server端的socket.

在read线程中,同时向所有的client端发送信息。

 

 

其中类ThreadSocketServer ,可以启动用来和用户一对一的对话。

 

 

 

package com.xiva.bean;

import java.io.*;
import java.net.*;


public class TalkClient {
	public static void main(String args[]) {
		try{
			Socket socket=new Socket("192.168.0.64",8080);
		
			ReadString read = new ReadString(socket);
			read.start();
			
			BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
			
			PrintWriter os=new PrintWriter(socket.getOutputStream());
	
			String readline=sin.readLine();
			
			while(!readline.equals("bye")){
				os.println(readline);
				os.flush();
				System.out.println("Client:"+readline);
				
				readline=sin.readLine();
			}
			os.close();

			socket.close();
		}catch(Exception e) {
			System.out.println("Error"+e);
		}
	}
}

class ReadString extends Thread {

	private Socket socket;
	public ReadString(Socket socket){
		this.socket = socket;
	}
    public void run() {
		try {
			BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
			//循环接受服务端信息
			while(true)
			{
				String read = is.readLine();
				System.out.println("Server:"+read);
				
				if(read.equals("bye"))
				{
					break;
				}
			}
			is.close();
			socket.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
}
 

客户端程序,在于启动一个线程监视server端传过来的message,同时可以不断的发送信息给server端。

 

 

这样多人聊天室,便实现了。

 

扩展方向,可以在list中绑定其他信息,比如userInfo。当客户端连接时,发送给客户端有哪些其它客户在线。同样绑定了userInfo后,这样就可以for循环时,判断线程中和那个用户绑定了,也不需要得到线程里面的具体信息了。这样一对一的聊天也很容易就实现了,这些只要有了这个主干下面的程序就好延伸了。

还有需要注意的就是线程存在的时间,我们可能需要写一个定时器,不断唤醒程序,以及让其睡眠。

今后实现了,源码再和大家分享;不过现在网上也有很多开源的这种代码,但自己写出来感觉还是不同。

 

 

 

 

8
1
分享到:
评论
2 楼 lockemn 2011-10-31  
客户端接受线程有问题,当输入"bye"退出聊天室,socket连接关闭,假如此时接受线程刚好在执行is.readLine(),而is输入流中的socket已关闭,则会抛出java.net.SocketException: Socket closed.
1 楼 dopic 2011-04-15  

相关推荐

    多线程同时操作全局变量的出错演示

    然而,多线程编程也带来了一些挑战,尤其是当多个线程同时访问共享资源,如全局变量时,可能会出现竞态条件(Race Condition)和其他并发问题。本文将深入探讨标题“多线程同时操作全局变量的出错演示”所涉及的知识...

    JAVA多线程并发操作全局变量

    NULL 博文链接:https://toknowme.iteye.com/blog/2212529

    Qt 多线程访问同一个变量

    标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先...

    采用全局变量方式实现多线程的通信

    下面我们将深入探讨如何利用全局变量进行多线程通信以及涉及的相关知识点。 首先,我们要理解什么是全局变量。全局变量是在函数外部定义的变量,它在整个程序中都是可见的,可以在程序的任何地方被访问。这种特性...

    基于多线程和SOCKET聊天室

    【标题】基于多线程和SOCKET聊天室 在IT领域,网络通信是不可或缺的一部分,尤其是在构建实时交互系统时,如聊天室。本项目“基于多线程和SOCKET聊天室”就是一个很好的实例,它利用C#语言在Windows Forms(WINFORM...

    C#Socket 多线程聊天室A

    在C#编程环境中,Socket和多线程技术的结合被广泛应用于网络通信,尤其是在构建聊天室这类实时交互的应用中。本项目"**C#Socket 多线程聊天室A**"是一个很好的学习资源,它展示了如何利用C#的Socket类进行网络通信...

    C#多线程与Socket聊天室的实现

    本文将深入探讨如何使用C#语言实现一个基于TCP/IP协议的多线程Socket聊天室。这个聊天室功能允许局域网内的多台计算机进行实时信息交互,虽然没有在广域网环境下测试,但在局域网内能有效工作。 首先,我们要理解...

    C#多线程socket聊天室A

    本项目“C#多线程socket聊天室A”就是一个很好的实例,它展示了如何利用C#的Socket类和多线程技术构建一个聊天服务器。 首先,让我们深入理解“Socket”。Socket是网络通信的基本单元,它是进程间通过网络进行通信...

    linux c tcp socket 多线程简易聊天室

    在Linux系统中,C语言与TCP Socket编程相结合可以创建出多线程的简易聊天室。这个项目主要涉及以下几个核心知识点: 1. **TCP Socket编程**: - TCP(Transmission Control Protocol)是一种面向连接的、可靠的...

    java多线程基于socket的简易聊天室源代码

    在Java编程领域,多线程和Socket通信是两个重要的概念,...总之,这个基于Java的多线程Socket聊天室源代码是学习网络编程和并发处理的好例子,它展示了如何使用Java的基本工具来创建一个基本但功能完整的网络应用程序。

    C++编写 win32控制台下 Socket通信 多线程 聊天室 服务器 客户端

    C++语言编写,SOCKET套接字通信,分服务器和客户端,多线程模型,Win32控制台。 首先聊天室分为服务端和客户端,通过TCP连接通信。运行顺序为: 1.首先打开服务服; 2.打开客户端,用户输入名字,连接到服务端后...

    C# 多线程socket 实例

    本篇文章将深入探讨如何在C#中利用多线程和socket技术创建一个聊天室实例。 首先,理解`socket`的概念至关重要。Socket是网络编程中的基本接口,它允许应用程序通过网络发送和接收数据。在C#中,我们可以使用System...

    java socket多线程多人聊天室

    在Java编程领域,Socket通信是实现网络应用间交互的基础,特别是在构建多用户聊天室时,多线程技术显得尤为重要。本项目"java socket多线程多人聊天室"旨在利用Java的Socket API创建一个支持多个客户端同时连接的...

    Socket和多线程的聊天室

    Socket编程和多线程技术是计算机网络编程中的两个重要概念,尤其在开发实时通信应用,如聊天室时,它们起着关键作用。本项目“Socket和多线程的聊天室”是一个基于控制台的简单聊天应用程序,允许用户通过命令行进行...

    c++通过结构体(struct)全局变量在多线程中传递参数

    本文将深入探讨如何使用结构体(struct)和全局变量在多线程间传递参数,特别是在Linux环境下使用`make`进行编译的情况。 首先,理解全局变量。全局变量是在函数外部定义的变量,可以在程序的任何地方被访问,只要...

    C++多线程SOCKET收发

    在C++编程中,多线程SOCKET收发是一项重要的技术,它允许程序同时处理多个网络连接,提高系统的并发性能。下面将详细讲解这个主题,包括C++中的多线程概念、SOCKET基础以及如何结合两者实现数据的收发。 首先,让...

    C#Socket多线程聊天室

    本项目"**C# Socket多线程聊天室**"就是一个典型的示例,它展示了如何利用C#的Socket类以及多线程技术创建一个简单的聊天应用。以下是关于这个项目的详细知识点: 1. **Socket编程**: Socket是网络通信中的基本组件...

    定义全局变量 变量 全局

    在MFC(Microsoft Foundation Classes)框架中,全局变量和函数的使用与标准C++有所不同,因为MFC工程通常由多个文件组成,需要一种方法来在这些文件之间共享数据和功能。这里将介绍两种在MFC工程中定义全局变量和...

Global site tag (gtag.js) - Google Analytics