`

socket实现客户端与客户端通信

    博客分类:
  • java
阅读更多

最近闲来无聊,看了一下socket通信,实现了一个最简版的客户端与客户端通信。

如果想通过客户端与客户端通信,有两种解决方案,一、使用服务器端进行转发,二、使用p2p技术

这里是使用服务器端进行转发写的例子,代码比较简陋,

主要思想是:

1、服务器端开启对socke的读写线程,用来监听客户端的通信

2、服务器端保存客户端登录的信息,使用一个map来装,保存维护该客户端的线程名、线程。

3、当客户端发来信息,进行分析,分析出是给哪一个客户端(维护客户端的线程)发送的信息,然后服务器端调用该线程的发送方法,发送给对应的客户端

下面是简陋的代码:

服务器端:MainServer

写道
package com.wang.server;
import java.net.ServerSocket;
import java.net.Socket;
import com.wangcanpei.util.Util;
public class MainServer {
 
 
 public static void main(String[] args) throws Exception {
  ServerSocket serverSocket=new ServerSocket(8888);
  while(true){
   Socket socket=serverSocket.accept();
   System.out.println(socket.getPort());
   ServerThread serverThread=new ServerThread(socket);
   System.out.println(serverThread.getName());
   serverThread.start();
   Util.map.put(serverThread.getName(),serverThread);
  }
 }
}
------------------------------------------------------------------------------------------------

ServerThread

写道
package com.wang.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.wangcanpei.util.Util;

public class ServerThread extends Thread{
private Socket socket;

OutputStream os = null;
BufferedWriter bw = null;
BufferedReader br = null;
InputStream is = null;
public ServerThread(Socket socket){
this.socket=socket;
}

public void write(String line){
try {
bw.write(line + "\r");
bw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public void run() {

try {
is = socket.getInputStream();
os = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(os));
br = new BufferedReader(new InputStreamReader(is));
while (true) {
//从客户端得到信息
String line = br.readLine();
//br = new BufferedReader(new InputStreamReader(System.in));

//这段代码是为了广播给所有的用户
// Map<String,Thread> map=Util.map;
// Set<String> set=map.keySet();
// for(Iterator<String> it=set.iterator();it.hasNext();){
// String key=it.next();
// ServerThread thread=(ServerThread)map.get(key);
// thread.write(line);
// }
//


//这段代码是为了给特定的用户发送
//分析客户端发送过的信息,看看是要发给谁?
Map<String,Thread> map=Util.map;
String who=line.substring(line.lastIndexOf("@")+1,line.length());
System.out.println("who"+who);
ServerThread thread=(ServerThread)map.get(who);

String message=line.substring(0,line.lastIndexOf("@"));
System.out.println("message"+message);
thread.write(message);


}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
os.close();
bw.close();
br.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
 Util
写道
package com.wang.util;

import java.util.HashMap;
import java.util.Map;

public class Util {
public static Map<String,Thread> map=new HashMap<String,Thread>();
}
 客户端
MainClient
写道
package com.wang.client;

import java.io.IOException;
import java.net.Socket;

public class MainClient {
public static void main(String[] args) {
try {

Socket socket = new Socket("127.0.0.1", 8888);
Thread clientInput = new ClientThreadInput(socket);
Thread clientOut = new ClientThreadOutput(socket);
clientInput.start();
clientOut.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
 
写道
package com.wang.client;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class ClientThreadOutput extends Thread {

private Socket socket;

public ClientThreadOutput(Socket socket) {
this.socket = socket;
}

public void run() {
OutputStream os = null;
BufferedWriter bw = null;
BufferedReader br = null;
try {

os = socket.getOutputStream();
while (true) {
bw = new BufferedWriter(new OutputStreamWriter(os));
br = new BufferedReader(new InputStreamReader(System.in));
bw.write(br.readLine() + "\r");
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
os.close();
bw.close();
br.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
 
写道
package com.wang.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

import javax.swing.text.AbstractDocument.BranchElement;

public class ClientThreadInput extends Thread {

private Socket socket;

public ClientThreadInput(Socket socket) {
this.socket = socket;
}

public void run() {
InputStream is = null;
BufferedReader br = null;
try {
is = socket.getInputStream();
while (true) {
br = new BufferedReader(new InputStreamReader(is));

String line = null;
while (null != (line = (br.readLine()))) {
System.out.println("从服务器端得到的信息:" + line);
}
}

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (null != is) {
try {
br.close();
is.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
}
}
 代码非常简陋,写着玩的。但是大概思想已经表达清楚

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics