当前位置: 代码迷 >> Java相关 >> Socket问题
  详细解决方案

Socket问题

热度:247   发布时间:2006-12-26 20:55:11.0
Socket问题
这是个测试Server保存client连接Server时的Socket的测试程序 有点错误
各位帮帮忙吧 谢谢了!
主要问题是
正确的进入chat(Socket a,Socket b){} 开始提供client1,client2 通信时
client1端发来的消息 一次到达client1本身的Server线程 (这里不对 )
另一次到达进入 client2的Server线程的 public void chat(Socket a,Socket b){}里 (这里是对的)

我感觉方法有问题 : 问: 怎么确定client 发送的消息到达本身的Server 还是进入通信方法中;
//Server 代码
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
public Server() {
}
public static void main(String[] args)throws IOException{
int i=0;
ServerSocket server=new ServerSocket(7777);
Hashtable<Integer,connectServer> saveThread=new Hashtable<Integer,connectServer>();
while(true){
try{
i=i+1;
System.out.println("waiting!!!");
Socket client=server.accept();
System.out.println("accept client finished!");
Integer ID=new Integer(i);
chatServer chatserver=new chatServer(client,saveThread);
chatserver.start();
saveThread.put(ID,new connectServer(i,client)); //保存Socket 对应的key每次简单的增1
}
catch(IOException e){
System.out.println(e);
}
}
}
}
class chatServer extends Thread{
Socket s;
Hashtable<Integer,connectServer> saveThread;
BufferedReader in;
PrintWriter out;
public chatServer(Socket s,Hashtable<Integer,connectServer>saveThread)throws IOException{
this.s=s;
this.saveThread=saveThread;
in=new BufferedReader(new InputStreamReader(s.getInputStream()));//创建输入流
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);//创建输出流
}
public void run(){
out.println("begin!");
while(true){
String s1=null;
try{
s1=in.readLine();
if(s1.equals("friend"))
{// 和好友通信!!
s1=in.readLine();
Integer ID=new Integer(s1); // 即Hashtable 的key
Socket chatone=new Socket();
chatone=saveThread.get(ID).socket;//注意client端输入的ID 以免越界出错 这里没做避免越界的处理!!
chat(s,chatone); //提供两个client通信!
break;
}else{
out.println("default!!");
System.out.println("default!!");
}
}
catch(Exception ex1){
System.out.println(ex1);
}
}
}
public void chat(Socket a,Socket b){ //通信方法 提供 两个client间的通信
try{
final BufferedReader isFromClient1 = new BufferedReader(new InputStreamReader(a.getInputStream()));
final PrintWriter osToClient1=new PrintWriter(new BufferedWriter(new OutputStreamWriter(a.getOutputStream())),true);
final BufferedReader isFromClient2 = new BufferedReader(new InputStreamReader(b.getInputStream()));
final PrintWriter osToClient2=new PrintWriter(new BufferedWriter(new OutputStreamWriter(b.getOutputStream())),true);
System.out.println("here! chat begin!");
System.out.println(a);
System.out.println(b);
new Thread(){
public void run(){
while(true){
try{
String str1=isFromClient1.readLine();
if(str1!=null)
{
osToClient2.println(str1);
}
else{
System.out.println("null");
}
try
{
sleep(500);
}
catch(InterruptedException ex1){
System.out.println(ex1);
}
}
catch(Exception ex)
{
System.out.println(ex);
}
}
}
}.start();
new Thread(){
public void run(){
while(true){
try{
String str2=isFromClient2.readLine();
if(str2!=null)
{
osToClient1.println(str2);
}
else{System.out.println("null");
}
try
{
sleep(500);
}
catch(InterruptedException ex1){
System.out.println(ex1);
}
}
catch(Exception ex)
{
System.out.println(ex);
}
finally{
}
}
}
}.start();
}
catch(Exception e){
System.out.println(e);
}
}
}
class connectServer{
int index;
Socket socket;
public connectServer(int index,Socket socket){
this.index=index;
this.socket=socket;
}
}

[此贴子已经被作者于2006-12-26 22:59:24编辑过]

搜索更多相关的解决方案: Socket  Server  client  线程  chat  

----------------解决方案--------------------------------------------------------

//client 代码
import java.net.*;
import java.io.*;
public class Client {
BufferedReader in;
PrintWriter out;
Socket s;
public Client() {
try{
Socket s=new Socket("localhost",7777);
in=new BufferedReader(new InputStreamReader(s.getInputStream()));
out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(s.getOutputStream())),true);
}
catch(Exception e)
{
System.out.println(e);
}
new Thread(){
public void run(){
while(true){
String s1=null;
try{
s1=in.readLine();
System.out.println(s1);
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String one=br.readLine();
if(one.equals("friend"))
{ // 和好友通信!!
System.out.println("输入对方ID:");
one=br.readLine();
out.println("friend");
out.println(one);
}
else{
out.println(one);
}
}
catch(Exception ex1){
System.out.println(ex1);
}
}
}
}.start();
}
public static void main(String[] args){
Client client=new Client();
}
}


----------------解决方案--------------------------------------------------------

晕! 代码太多了

[此贴子已经被作者于2006-12-27 10:31:28编辑过]


----------------解决方案--------------------------------------------------------
那还是高手们给我一个方法吧!!
我的想法是: Server继承Thread 每次Client端连接时 生成一个线程为其服务;
比如有10个client时 其中的任何一个client都可以提出请求 要求和其他的client通信(即简单的字符串传送)
( 每个client都对应唯一的ID 用于Server找到对应的client )

版主们帮帮忙吧 !
给我一个例子 最好! 麻烦的话 给点提示 (详细点)
现在我想不到解决的办法了 很急用的!! 谢谢了

[此贴子已经被作者于2006-12-27 10:40:34编辑过]


----------------解决方案--------------------------------------------------------
你不应该这样来实现

如果你想实现聊天室的功能,直接用TCP接是不好连的,你要得到每一个socket的输入输出流

你可以用UDP或者Multicast来连

还有,你可以在每个新起的线程中实现一个公共的方法,这样,你就没有必要每次都去得到输入输出流,而直接调用相关的方法就可以了
----------------解决方案--------------------------------------------------------

千里你的意思是 每次只要调用那个公用方法嘛
比如 public void chat(Stirng s)
{
//.....
}
这样嘛?
那我先看看UDP实现吧


----------------解决方案--------------------------------------------------------

是的,
然后在里在实现就可以了,比如根据传进来的名字找到相应的IP和端口,然后向那个IP和端口发一个数据包就可以了


----------------解决方案--------------------------------------------------------

谢谢了 我先试试


----------------解决方案--------------------------------------------------------
  相关解决方案