`
一帆过海
  • 浏览: 16214 次
  • 性别: Icon_minigender_1
  • 来自: 济南
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个简单的聊天程序

阅读更多

昨天写了一个回显服务器,今天在回显服务器的基础上开发了一个简易的聊天程序。比较简易,存下代码。

 

package in.sikaijian.easytalk;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

/**
 * easy talk server
 * @author sikaijian
 */
public class EasyTalkServer {

	private final ServerSocket server;

	/**
	 * initialize port
	 * @param port
	 * @throws Exception
	 */
	public EasyTalkServer(int port) throws Exception{
		this.server = new ServerSocket(port);
	}

	/**
	 * start up echo server
	 */
	public void startUp(){
		System.out.println( "----easyTalk server start----" );
		System.out.println("listening on port : " + this.server.getLocalPort() + "...");

		Thread servThread = new Thread( new Runnable()
		{
			@Override
			public void run()
			{
				/**
				 * wait for request socket when a request come, start up a thread to handle the request
				 */
				while (true)
				{
					try
					{
						Socket client = EasyTalkServer.this.server.accept();
						Thread servThread = new Thread( new EchoThread( client ) );
						servThread.start();
					}
					catch (Exception e)
					{
						e.printStackTrace();
					}
				}

			}
		} );

		servThread.start();

	}

	/**
	 * request handler thread
	 * @author sikaijian
	 */
	private class EchoThread implements Runnable{
		private final Socket client;
		
		public EchoThread(Socket client){
			this.client = client;
		}
		
		@Override
		public void run() {
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
				System.out.println("request socket address : " + client.getRemoteSocketAddress());
				
				/*
				 * server a request until socket closed by client and assume that client closed when exception
				 * occurs
				 */
				while(true){
					try {
						String line = reader.readLine();
						System.out.println( client.getRemoteSocketAddress() + " send message [ " + line + "]" );
					} catch (SocketException e) {
						if(client!=null){
							client.close();	
						}

						break;
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 package in.sikaijian.easytalk; 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * easy talk client
 * @author sikaijian
 */
public class EasyTalkClient {

	private String netWorkName;


	public void setNetWorkName(String name)
	{
		this.netWorkName = name;
	}


	public void startAtalk(String talkToIp, int talkPort)
	{
		Thread talk = new Thread( new Chart( talkToIp, talkPort ) );
		talk.start();
	}

	private class Chart implements Runnable
	{

		private final String ip;

		private final int port;

		public Chart(String ip, int port)
		{
			this.ip = ip;
			this.port = port;
		}


		@Override
		public void run()
		{
			PrintWriter out = null;
			BufferedReader netWorkIn = null;

			try
			{
				Socket theSocket = new Socket( ip, port );
				netWorkIn = new BufferedReader( new InputStreamReader( theSocket.getInputStream() ) );
				out = new PrintWriter( new OutputStreamWriter( theSocket.getOutputStream() ) );

				BufferedReader userIn = new BufferedReader( new InputStreamReader( System.in ) );

				System.out.println( "----Connect to " + ip + " server successed, input 'exit' to end a chart---" );
				while (true)
				{
					String line = userIn.readLine();
					if (line.equals( "exit" ))
						break;

					out.println( EasyTalkClient.this.netWorkName + " say : " + line );
					out.flush();

					System.out.println( netWorkIn.readLine() );
				}
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}

 package in.sikaijian.easytalk;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class EasyTalk
{
	private final EasyTalkServer server;

	private final EasyTalkClient client;

	public static final int defaultServPort = 19891;


	public EasyTalk(int localServPort) throws Exception
	{
		server = new EasyTalkServer( localServPort );
		server.startUp();
		client = new EasyTalkClient();
	}


	public void startAtalk(String talkTo, int remoteServPort)
	{
		client.startAtalk( talkTo, remoteServPort );
	}


	public void setName(String yourName)
	{
		client.setNetWorkName( yourName );
	}

	public static void main(String[] args) throws Exception
	{
		System.out.println( "-------------Easy Talk Version 1.0---------------" );
		BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );

		System.out.println( "Input your local server port : " );
		int localServPort = Integer.parseInt( reader.readLine() );

		EasyTalk aTalk = new EasyTalk( localServPort );

		System.out.print( "Input your name : " );
		String name = reader.readLine();

		System.out.print( "Input the ip you want to talk to : " );
		String talkTo = reader.readLine();

		System.out.print( "Input the remote server port : " );
		int remoteServPort = Integer.parseInt( reader.readLine() );

		System.out.println( "---Nice to meet you " + name + " your are talking to " + talkTo + "---" );
		System.out.println();

		aTalk.setName( name );
		aTalk.startAtalk( talkTo, remoteServPort );
	}
}
分享到:
评论

相关推荐

    一个简单聊天程序

    【标题】:“一个简单聊天程序” 【描述】:“很好用啊 ....” 这个简短的描述表明我们正在讨论的是一款简单的聊天程序,它可能具有易用性,并且在实际使用中得到了用户的好评。通常,这样的程序允许用户通过网络...

    用VC做的一个简单聊天程序

    标题中的“用VC做的一个简单聊天程序”指的是使用Microsoft Visual C++(简称VC)开发的一款基本的聊天应用程序。VC是一个集成开发环境,主要用于编写C++代码,它提供了丰富的库支持和调试工具,使得开发者能够创建...

    ASP.NET 做的一个简单聊天程序(TcpListener)

    在这个"ASP.NET 做的一个简单聊天程序(TcpListener)"项目中,开发者使用了.NET框架下的TcpListener类来实现一个简单的聊天服务。TcpListener是System.Net.Sockets命名空间中的一个类,它负责监听特定端口上的TCP连接...

    mfc编写的简单聊天程序

    【标题】"MFC编写的简单聊天程序"指的是利用Microsoft Foundation Classes (MFC)库开发的一个基础级聊天应用程序。MFC是微软为Windows操作系统提供的一个C++类库,它简化了Windows API的使用,使开发者能够更高效地...

    QT 简单聊天程序

    在这个“QT简单聊天程序”中,我们有两个主要部分:ChatServer和ChatClient,分别代表服务端和客户端。 **服务端(ChatServer)** 1. **QTcpServer**: 服务端的核心是`QTcpServer`类,它负责监听来自客户端的TCP...

    Java编写的简单聊天程序

    这是用Java编写的简单聊天程序 可供初学者下载学习

    JAVA简单聊天程序

    我用JAVA的servlet写的这个小聊天程序,总共才几KB,但可以在不同的电脑上进行多人对话,删除记录等,我把数据库验证登陆写进去了,你若不想要这个登陆程序...这个程序结构清析,看了后你也可以自己动手写聊天程序了。

    精彩编程与编程技巧-简单的聊天程序...

    通过本文的学习,我们了解了一个简单聊天程序的构建过程,包括环境准备、用户界面设计以及连接逻辑等方面的知识点。虽然这是一个较为基础的例子,但它为深入学习更复杂的即时通讯系统打下了良好的基础。未来,随着...

    UDP简单聊天程序示例

    在这个"UDP简单聊天程序示例"中,我们将探讨如何利用C#中的`UdpClient`类来实现一个简单的UDP聊天应用。 首先,我们要理解`UdpClient`类在.NET Framework中的作用。`UdpClient`是System.Net.Sockets命名空间下的一...

    一个简单网络聊天程序

    从给定的文件信息中,我们可以提取到关于网络...通过以上步骤,可以实现一个基础的网络聊天程序,其中涉及到了网络通讯的基本原理、TCP/IP协议的应用以及Socket控件的实际操作,为学习网络编程提供了很好的实践案例。

    Java编的一个简单的聊天程序

    以上就是Java编写的简单聊天程序可能涉及的关键技术点。实际的聊天程序可能会更复杂,包括用户认证、消息加密、聊天记录存储等功能,但这些基本概念构成了此类程序的基础。通过学习和实践这些知识点,你可以构建出...

    一个最简单的聊天程序

    本篇文章将详细讲解如何利用Java编写一个最简单的聊天程序。 首先,我们需要理解Java中的基本概念。Java是一种面向对象的语言,它的核心特性包括封装、继承和多态性。在构建聊天程序时,我们将主要使用面向对象的...

    简单的聊天程序

    【标题】"简单的聊天程序"揭示了这是一个基于Java编程语言构建的初级聊天应用程序。这个程序设计用于在两台计算机之间进行一对一的实时通信,提供基本的文本消息传递功能。通过这个程序,用户可以理解如何使用Java来...

    基于TCP的简单一对一聊天程序设计

    设计一个简单的TCP聊天程序,我们需要考虑以下几个关键步骤: 1. **服务器端实现**:服务器端需要监听特定的端口,等待客户端的连接请求。在C++或Python等编程语言中,我们可以使用socket库来创建服务器套接字,并...

    ocsf(面向对象cs框架)java简单聊天程序

    采用面向对象软件工程中的框架制作的一个简单聊天程序,实现一些基本的聊天功能,可以在这个基础上继续进行修改,增加相关的功能。使用方法,1、在eclipse中新建一个工程(如,myChat),2、把simpleChat下的所有文件...

    简单的聊天程序 有界面的

    【描述】:“有界面的简单聊天程序 可以实现多人聊天” 描述进一步确认了该程序的主要特性,即不仅具备用户友好的图形界面,还允许多用户参与同一聊天室进行对话。这暗示了程序可能采用了客户端-服务器架构,其中...

    java写的简单聊天程序

    在这个“java写的简单聊天程序”中,我们主要关注的是如何使用Java来实现一个基本的多线程聊天应用。下面将详细探讨相关知识点。 首先,我们来看`Server.java`。在服务器端,一般会创建一个监听线程,用于接收...

Global site tag (gtag.js) - Google Analytics