求教java聊天工具服务器怎么转发数据

l206180 2011-12-26 08:26:33
一个server 2个客户端 A 发送的数据到server 后 zerver怎么给B最好给段代码写过run函数 一个菜鸟的问题 随便什么流 TCP协议的套接字那种
...全文
125 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
西部流云 2011-12-26
  • 打赏
  • 举报
回复
服务器端:

import java.net.*;
import java.io.*;
import java.util.*;
public class Server{
private ServerSocket ss;
private Map<String,Socket> map = new HashMap<String,Socket>();
private BufferedReader in;
private PrintWriter out;

public Server() {
try {
ss = new ServerSocket(6000);
//开启一个发送线程
SSendThread sst = new SSendThread(this);
new Thread(sst).start();
while(true) {
Socket socket = ss.accept();
ServerProxy sp = new ServerProxy();
sp.acceptClient(this,socket);
}
}catch (IOException e) {
out.println("wrong");
}
}

public boolean isQuit(){
return false;
}
public void quit(boolean b){

}

public void addClient(String name,Socket socket){
if(getSocket(name) == null){
map.put(name,socket);
}
}

public Socket getSocket(String name){
return (Socket)map.get(name);
}
public static void main(String[] args) {
new Server();
}
}

/**
* 服务器代理,用于处理一个客户端的请求。一个客户端对应一个代理
*/
class ServerProxy{
private SSReceiveThread rt;
public void acceptClient(Server server,Socket socket)
{
rt = new SSReceiveThread(server,socket);
new Thread(rt).start();
}
}
class SSReceiveThread implements Runnable{
private Socket socket;
private Server server;
public SSReceiveThread(Server server,Socket socket){
this.server = server;
this.socket = socket;
}
public void run(){
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
BufferedReader in;
while(true){
if(server.isQuit()){return;}
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[1024*1024*5];
String lineStr = "";
/*while((lineStr = in.readLine()) != null){
System.out.println(lineStr);
}*/
int len = in.read(buffer,0,buffer.length);
String context = new String(buffer,0,len);
String name = parseContext(context);
server.addClient(name,socket);
System.out.print(context);
}catch(IOException e) {
System.out.println("SSReceiveThread Wrong");
e.printStackTrace();
return;
}
}

}

public String parseContext(String context){
return context.substring(0,context.indexOf(":"));
}
}


class SSendThread implements Runnable{
private Server server;
public SSendThread(Server server){
this.server = server;
}
public void run(){
while(true){
try {

BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
String respMsg = line.readLine();
if(respMsg.equals("quit")){
server.quit(true);
return;
}
sendRespMsg(respMsg);

}catch(IOException e) {
System.out.println("SSendThread Wrong");
}
}

}

public void sendRespMsg(String respMsg){
String newMsg = respMsg;
if(respMsg.indexOf("a:") == -1 && respMsg.indexOf("b:") == -1){
newMsg = "a:";
newMsg += respMsg;
}
String name = newMsg.substring(0,respMsg.indexOf(":"));
Socket s = server.getSocket(name);
try {
PrintWriter out;
out = new PrintWriter(s.getOutputStream(),true);
out.println(newMsg);
}catch(IOException e){
System.out.println("SSendThread Wrong");
}
}
}



发送内容的格式:
a:xxxxx
b:xxxxx

其他不支持。
西部流云 2011-12-26
  • 打赏
  • 举报
回复
给你一完整的,作为一块砖。

修改后的客户端:

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

public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
boolean isQuit;
public Client() {
try {
System.out.println("Try to Connect to 10.144.200.165:6000");
socket = new Socket("10.144.200.165",6000);
}catch(Exception e){
System.out.println("wrong");
}
isQuit = false;
}
public void send(){
SendThread sd = new SendThread(this);
new Thread(sd).start();
}
public void server(){
ReceiveThread st = new ReceiveThread(this);
new Thread(st).start();
}

public void over(){
try{
out.close();
in.close();
socket.close();
}catch(Exception e) {
System.out.println("Wrong");
}

}
public Socket getSocket(){return socket;}
public boolean isQuit() {return isQuit;}
public void quit(boolean b){isQuit = b;}


public static void main(String[] args) throws Exception{
Client c1 = new Client();
c1.server();
Thread.sleep(1000);
c1.send();
}
}

class ReceiveThread implements Runnable{
Client cl;
public ReceiveThread(Client cl){this.cl = cl;}
public void run(){
BufferedReader in;
Socket socket = cl.getSocket();

while(true){
if(cl.isQuit()){return;}
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[1024*1024*5];
String lineStr = "";
/*while((lineStr = in.readLine()) != null){
System.out.println(lineStr);
}*/
int len = in.read(buffer,0,buffer.length);
System.out.print(new String(buffer,0,len));
}catch(IOException e) {
System.out.println("ReceiveThread Wrong");
e.printStackTrace();
return;
}
}

}
}


class SendThread implements Runnable{
Client cl;
public SendThread(Client cl){this.cl = cl;}
public void run(){
PrintWriter out;
Socket socket = cl.getSocket();
while(true){
try {
out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
String tmp = line.readLine();
if(tmp.equals("quit")){
cl.quit(true);
return;
}
out.println(tmp);
}catch(IOException e) {
System.out.println("SendThread Wrong");
}
}

}


public void sendRespMsg(String respMsg){
String newMsg = respMsg;
if(respMsg.indexOf("a:") == -1 && respMsg.indexOf("b:") == -1){
newMsg = "a:";
newMsg += respMsg;
}
Socket s = cl.getSocket();
try {
PrintWriter out;
out = new PrintWriter(s.getOutputStream(),true);
out.println(newMsg);
}catch(IOException e){
System.out.println("SSendThread Wrong");
}
}
}
西部流云 2011-12-26
  • 打赏
  • 举报
回复
给你一完整的,作为一块砖。

修改后的客户端:

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

public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
boolean isQuit;
public Client() {
try {
System.out.println("Try to Connect to 10.144.200.165:6000");
socket = new Socket("10.144.200.165",6000);
}catch(Exception e){
System.out.println("wrong");
}
isQuit = false;
}
public void send(){
SendThread sd = new SendThread(this);
new Thread(sd).start();
}
public void server(){
ReceiveThread st = new ReceiveThread(this);
new Thread(st).start();
}

public void over(){
try{
out.close();
in.close();
socket.close();
}catch(Exception e) {
System.out.println("Wrong");
}

}
public Socket getSocket(){return socket;}
public boolean isQuit() {return isQuit;}
public void quit(boolean b){isQuit = b;}


public static void main(String[] args) throws Exception{
Client c1 = new Client();
c1.server();
Thread.sleep(1000);
c1.send();
}
}

class ReceiveThread implements Runnable{
Client cl;
public ReceiveThread(Client cl){this.cl = cl;}
public void run(){
BufferedReader in;
Socket socket = cl.getSocket();

while(true){
if(cl.isQuit()){return;}
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[1024*1024*5];
String lineStr = "";
/*while((lineStr = in.readLine()) != null){
System.out.println(lineStr);
}*/
int len = in.read(buffer,0,buffer.length);
System.out.print(new String(buffer,0,len));
}catch(IOException e) {
System.out.println("ReceiveThread Wrong");
e.printStackTrace();
return;
}
}

}
}


class SendThread implements Runnable{
Client cl;
public SendThread(Client cl){this.cl = cl;}
public void run(){
PrintWriter out;
Socket socket = cl.getSocket();
while(true){
try {
out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
String tmp = line.readLine();
if(tmp.equals("quit")){
cl.quit(true);
return;
}
out.println(tmp);
}catch(IOException e) {
System.out.println("SendThread Wrong");
}
}

}


public void sendRespMsg(String respMsg){
String newMsg = respMsg;
if(respMsg.indexOf("a:") == -1 && respMsg.indexOf("b:") == -1){
newMsg = "a:";
newMsg += respMsg;
}
Socket s = cl.getSocket();
try {
PrintWriter out;
out = new PrintWriter(s.getOutputStream(),true);
out.println(newMsg);
}catch(IOException e){
System.out.println("SSendThread Wrong");
}
}
}
l206180 2011-12-26
  • 打赏
  • 举报
回复
再问下 服务器端判断用户A B socket那段线程代码应该怎么写啊
[Quote=引用 1 楼 likefire 的回复:]
一般server段用多线程来实现。
这是我写的客户端,通过telnet连接服务器的,希望对你有帮助

Java code

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

public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
……
[/Quote]
l206180 2011-12-26
  • 打赏
  • 举报
回复
再问下 服务器端判断用户A B socket那段线程代码应该怎么写啊

[Quote=引用楼主 l206180 的回复:]
一个server 2个客户端 A 发送的数据到server 后 zerver怎么给B最好给段代码写过run函数 一个菜鸟的问题 随便什么流 TCP协议的套接字那种
[/Quote]
shiqilovejava 2011-12-26
  • 打赏
  • 举报
回复
恩 很好 楼上支持一下
西部流云 2011-12-26
  • 打赏
  • 举报
回复
一般server段用多线程来实现。
这是我写的客户端,通过telnet连接服务器的,希望对你有帮助

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

public class Client {
Socket socket;
BufferedReader in;
PrintWriter out;
boolean isQuit;
public Client() {
try {
System.out.println("Try to Connect to 127.0.0.1:23");
socket = new Socket("10.144.205.98",23);
}catch(Exception e){
System.out.println("wrong");
}
isQuit = false;
}
public void send(){
SendThread sd = new SendThread(this);
new Thread(sd).start();
}
public void server(){
ServerThread st = new ServerThread(this);
new Thread(st).start();
}

public void over(){
try{
out.close();
in.close();
socket.close();
}catch(Exception e) {
System.out.println("Wrong");
}

}
public Socket getSocket(){return socket;}
public boolean isQuit() {return isQuit;}
public void quit(boolean b){isQuit = b;}


public static void main(String[] args) throws Exception{
Client c1 = new Client();
c1.server();
Thread.sleep(1000);
c1.send();
}
}

class ServerThread implements Runnable{
Client cl;
public ServerThread(Client cl){this.cl = cl;}
public void run(){
BufferedReader in;
Socket socket = cl.getSocket();

while(true){
if(cl.isQuit()){return;}
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
char[] buffer = new char[1024*1024*5];
String lineStr = "";
/*while((lineStr = in.readLine()) != null){
System.out.println(lineStr);
}*/
int len = in.read(buffer,0,buffer.length);
System.out.print(new String(buffer,0,len));
}catch(IOException e) {
System.out.println("ServerThread Wrong");
e.printStackTrace();
return;
}
}

}
}


class SendThread implements Runnable{
Client cl;
public SendThread(Client cl){this.cl = cl;}
public void run(){
PrintWriter out;
Socket socket = cl.getSocket();
while(true){
try {
out = new PrintWriter(socket.getOutputStream(),true);
BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
String tmp = line.readLine();
if(tmp.equals("quit")){
cl.quit(true);
return;
}
out.println(tmp);
}catch(IOException e) {
System.out.println("SendThread Wrong");
}
}

}
}

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧