| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 730 人关注过本帖
标题:Socket问题
只看楼主 加入收藏
海狂
Rank: 1
等 级:新手上路
威 望:1
帖 子:234
专家分:0
注 册:2006-12-26
收藏
 问题点数:0 回复次数:7 
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 
2006-12-26 20:55
海狂
Rank: 1
等 级:新手上路
威 望:1
帖 子:234
专家分:0
注 册:2006-12-26
收藏
得分:0 

//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-26 20:56
ttrr550
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2006-11-5
收藏
得分:0 

晕! 代码太多了

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


2006-12-27 10:27
海狂
Rank: 1
等 级:新手上路
威 望:1
帖 子:234
专家分:0
注 册:2006-12-26
收藏
得分:0 
那还是高手们给我一个方法吧!!
我的想法是: Server继承Thread 每次Client端连接时 生成一个线程为其服务;
比如有10个client时 其中的任何一个client都可以提出请求 要求和其他的client通信(即简单的字符串传送)
( 每个client都对应唯一的ID 用于Server找到对应的client )

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

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


2006-12-27 10:39
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 
你不应该这样来实现

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

你可以用UDP或者Multicast来连

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

可惜不是你,陪我到最后
2006-12-27 10:49
海狂
Rank: 1
等 级:新手上路
威 望:1
帖 子:234
专家分:0
注 册:2006-12-26
收藏
得分:0 

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


2006-12-27 11:27
千里冰封
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:灌水之王
等 级:版主
威 望:155
帖 子:28477
专家分:59
注 册:2006-2-26
收藏
得分:0 

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


可惜不是你,陪我到最后
2006-12-27 11:35
海狂
Rank: 1
等 级:新手上路
威 望:1
帖 子:234
专家分:0
注 册:2006-12-26
收藏
得分:0 

谢谢了 我先试试


2006-12-27 13:45
快速回复:Socket问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025532 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved