`

简单的消息发送

阅读更多


实现过程:
包括四个类:1,ChatClient:输入用户名,启动客户端子线程。2,ClientThread:根据用户名与服务端连接,接收服务端转发的消息并显示。
3,ChatServer:监听客户端请求,交给服务端子线程处理。4,ServerThread:处理客户端输入/输出和消息转发任务,在构造函数中在第一次建立连接时读取客户端发送的用户名并将其添加到客户端列表

 
package com.test.example;

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

public class ChatClient {
  
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			ClientThread client = new ClientThread(args[0]) ;
			client.start() ;
			
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
			
			//读取键盘输入
			String readline ;
			while((readline = br.readLine()) != null){
				if(readline.equals("bye")){
					client.close() ;
					System.exit(0) ;
				}
				client.send(readline) ;
			}
		}catch(IOException e){
			e.printStackTrace() ;
		}
	}

}


package com.test.example;

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

public class ClientThread extends Thread {
	
	Socket socket ;
	BufferedReader br ;
	PrintWriter pw ;
	
	//启动客户端
	public ClientThread(String username){
		try{
			//连接服务端
			socket = new Socket("localhost", 12345) ;
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
			pw = new PrintWriter(socket.getOutputStream()) ;
			
			//发送用户名
			pw.println(username) ;
			pw.flush() ;
			
		}catch(IOException e){
			e.printStackTrace() ;
		}
	}
	
	//读取从服务端转发来的消息
	public void run(){
		try{
			String readLine ;
			while((readLine = br.readLine()) != null){
				System.out.println("消息来自: " + readLine) ;
			}
		}catch(IOException e){
			e.printStackTrace() ;
		}
	}
	
	//发送消息
	public void send(String message){
		pw.println(message) ;
		pw.flush() ;
	}
	
	//关闭客户端
	public void close(){
		try{
			br.close() ;
			pw.close() ;
			socket.close() ;
			
		}catch(IOException e){
			e.printStackTrace() ;
		}
	}
}


package com.test.example;

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

public class ChatServer {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		ServerSocket server = null ;
		
		try{
			
			server = new ServerSocket(12345) ;
			System.out.println("服务器启动:" + server.getInetAddress().getHostAddress() + ":" + server.getLocalPort()) ;
			
			//客户端列表
			Hashtable<String, ServerThread> clienList = new Hashtable<String, ServerThread>() ;
			
			//监听,处理
			while(true){
				
				Socket socket = server.accept() ;
				new ServerThread(socket,clienList).start() ;
				
			}
		}catch(IOException e){
			e.printStackTrace() ;
		}finally{
			try{
				
				server.close() ;
				
			}catch(IOException e){
				e.printStackTrace() ;
			}
		}
	}

}


package com.test.example;

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

public class ServerThread extends Thread {
	
	Socket socket ;
	BufferedReader br ;
	PrintWriter pw ;
	Hashtable<String, ServerThread> clientlist ;         //客户端列表
	String username ;                                   //用户名
	
	public ServerThread(Socket socket, Hashtable<String, ServerThread> clientlist){
		
		this.socket = socket ;
		this.clientlist = clientlist ;
		
		try{
			
			br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
			pw = new PrintWriter(socket.getOutputStream()) ;
			
			//读取用户名
			this.username = br.readLine() ;
			clientlist.put(username, this) ;
			//显示连接信息
			System.out.println(username + "连接:" + socket.getInetAddress().getHostAddress() + ":" + socket.getLocalPort()) ;
			
		}catch(IOException e){
			e.printStackTrace() ;
		}
	}
	
	public void run(){
		try{
			//处理客户端输入
			String line ;
			while((line = br.readLine()) != null){
				//用户输入信息
				System.out.println(username + "发给 " + line) ;
				System.out.println() ;
				if(line.equals("bye"))
					break ;
				else{
					//转发消息
					String []arr = line.split(":") ;
					if(arr.length == 2){
						if(clientlist.containsKey(arr[0])){
							clientlist.get(arr[0]).send(username + ":" + arr[1]) ;
						}
					}
				}
			}
			
			br.close() ;
			pw.close() ;
			socket.close() ;
			
		}catch(IOException e){
			e.printStackTrace() ;
		}
	}
	
	public void send(String message){
		System.out.println("发给" + username + " " + message) ;
		pw.println(message) ;
		pw.flush() ;
	}
}
 

 

0
1
分享到:
评论

相关推荐

    可局域网中进行简单的消息发送器

    【标题】: "可局域网中进行简单的消息发送器" 在IT领域,尤其是在网络通信技术中,构建一个能够在局域网(LAN)内发送消息的简单工具是一项基础且实用的任务。标题提到的"可局域网中进行简单的消息发送器"就是这样...

    TCP简单消息发送

    一款简单的TCP互相发送消息的程序,子进程和父进程可以互相发送或接受消息。

    利用NC消息平台发送消息.docx

    NC 消息平台是一种功能强大且灵活的消息发送平台,提供了多种方式来发送消息,本文将详细介绍如何使用 NC 消息平台发送消息。 一、发送简单通知消息 发送简单通知消息可以使用平台提供的 SmartMsgVO,该 VO 简化了...

    演示线程消息发送,只是一个简单的实例

    在IT领域,线程消息发送是一种常见的多线程编程技术,用于在线程间进行通信和同步。本实例的目的是向开发者展示如何实现这一机制。在标题和描述中提到的"演示线程消息发送",我们可以理解为这是一个教学或示例项目,...

    易语言窗口发送消息调整大小

    这段代码首先获取当前窗体的句柄,然后设置要发送的消息编号为WM_SIZE,附加数据为HTCAPTION,最后调用`发送消息`命令将消息发送给窗体。这样,窗口就会响应这个消息,执行相应的大小调整操作。 除了手动发送WM_...

    使用webSocket简单实现群发消息和指定用户发送消息

    群发消息的实现方式是,服务器在接收到需要广播的消息时,遍历所有活跃的WebSocket连接,并通过`send`方法将消息发送到每个连接。这种方法适用于需要将同一消息推送给所有在线用户的场景,例如公告通知。 对于指定...

    java模拟消息服务器发送消息

    在模拟过程中,需要与实际的短信网关API集成,遵循其提供的API规范进行消息发送。 文件"SendMessage"可能包含了实现这些功能的Java类或接口。通常,这个类可能有以下方法: 1. `enqueue(Message message)`: 将新...

    C#消息队列发送及接收

    然后,我们通过`MessageQueue`类找到或创建名为"myQueue"的私有队列,并将消息发送到队列中。 **接收消息:** ```csharp using System.Messaging; // 获取队列路径 string queuePath = ".\\private$\\myQueue"; /...

    C#最精简的微信企业号发送消息

    在本文中,我们将深入探讨如何使用C#语言实现微信企业号的消息发送功能,以及相关的技术要点。 首先,"C#最精简的微信企业号发送消息"这个标题暗示我们关注的是一个简单的C#程序,该程序可以向微信企业号发送消息。...

    C# .net winform sms send receive 发送 接受 短消息 发送 接受 消息

    `SendSMSForms`可能是用于发送短信的窗体,用户可以在这里输入接收方电话号码和消息内容,点击发送按钮后,程序会通过后台逻辑执行发送操作。 为了实现这些功能,开发者可能使用了如`System.Net.Sockets`库来处理...

    MFC发送消息与接收消息的例子

    例如,假设我们有一个简单的MFC对话框应用程序,我们想要从一个按钮的点击事件中发送一个自定义消息到对话框本身。以下是如何使用`PostMessage`实现这个功能: ```cpp // 在按钮点击事件处理函数中 void CMyDialog:...

    数据复制消息发送端

    本资源“数据复制消息发送端”是一个基于Visual Studio 2012的工程文件,它专门实现了`WM_COPYDATA`消息的发送端功能。 首先,我们来深入理解`WM_COPYDATA`。这是Windows消息系统中定义的一个窗口消息,其消息...

    跨进程发送消息数据

    开发者需要创建一个可以接收消息的窗口,然后在另一个进程中调用 API 函数将消息发送到这个窗口。此外,可能会涉及到线程同步、内存共享等技术,以确保数据的一致性和正确性。 总的来说,这个资源提供了一个关于 ...

    visual c++制作简单的局域网消息发送工具

    在本文中,我们将深入探讨如何使用Visual C++(VC++)来制作一个简单的局域网消息发送工具。这个工具基于TCP协议的socket编程,能够实现基本的即时通讯(IM)功能,类似于早期的OICQ(现在称为QQ)。我们将涵盖以下...

    QQ自动发送消息器

    QQ自动发送消息器是一款基于C#和.NET框架开发的应用程序,设计用于自动化发送QQ消息。...然而,需要注意的是,频繁或未经授权的自动消息发送可能会违反QQ的服务条款,因此在实际应用时应确保符合相关规定。

    局域网Ping和消息发送程序源码

    本项目名为“局域网Ping和消息发送程序”,是用C#语言编写的,主要功能是实现局域网内的设备探测与消息传递。以下是对这个程序源码的相关知识点的详细解释: 1. **Ping技术**:Ping是网络诊断工具,通过发送ICMP...

    C#开发之微信小程序发送模板消息功能

    组件,属性report-submit为true时,可以声明为需发模板消息,此时点击按钮提交表单可以获取formId,用于发送模板消息。或者当用户完成支付行为,可以获取prepay_id用于发送模板消息。 步骤三:调用接口下发模板消息...

    C# Winform中使用SendMessage消息发送拦截

    在提供的案例"WindowsFormsApp1"中,可能包含了一个简单的Winform应用,该应用展示了如何使用`SendMessage`发送消息,并通过`WndProc`来拦截和处理这些消息。通过分析这个案例的源代码,我们可以学习到如何在实际...

    发送消息例程传送指针方法

    在Windows操作系统中,例如,我们可以使用`SendMessage`或`PostMessage`函数,将包含文本的WM_USER自定义消息发送给目标窗口。 然后,我们来看“发送指针”。这里的难点在于指针本质上是内存地址,发送一个指针意味...

    VB局域网消息发送

    本项目“VB局域网消息发送”提供了这样的解决方案,允许用户通过简单的界面在同一个局域网内的计算机之间发送文本消息。 要实现这个功能,首先需要理解局域网的基本原理。局域网(LAN,Local Area Network)是一种...

Global site tag (gtag.js) - Google Analytics