昨天写了一个回显服务器,今天在回显服务器的基础上开发了一个简易的聊天程序。比较简易,存下代码。
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 );
}
}
本文介绍了一个基于Java的简易聊天程序的实现过程。该程序包括服务器端和客户端两部分,能够实现基本的消息收发功能。服务器端通过监听指定端口接收连接请求,并为每个客户端创建独立的处理线程。
2125

被折叠的 条评论
为什么被折叠?



