SOCKET如何同时收发?

x3302 2006-06-01 06:35:21
我刚接触SOCKET
网上的通过SOCKET连接的C/S结构的简单聊天程序
大多是采取一问一答形式
即client对server说完话后,要等待server回应才可以继续说
反之亦然

如何可以做到双方可以随时发话?(不用UDP连接方式实现)

设想是client建两个socket分别进行收和发
但发现server好象很难识别哪个socket是做什么的。

谁有好的方法,告诉一下,谢谢!
...全文
669 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
x3302 2006-06-01
  • 打赏
  • 举报
回复
我形容例子的也可以简单抽象成

server每1秒向client发出信息,client每1秒都显示这信息
client每10秒向server发出信息,server再刚才每1秒发出消息的同时
每隔10秒显示client发出的信息
x3302 2006-06-01
  • 打赏
  • 举报
回复
To: afgkidy(酷斯拉迪)

你这种方法还是一收一发方式的。
我把client那的sleep设成了10秒
那么server端还是要等client端的线程完成一个循环才会执行server端那些代码

我要的效果是,例如:
我先在client端发:“A1”回车;“B1”回车;“C1”回车。
server端在可以输入的状态下,仍然可以显示出“A1”,“B1”,“C1”。

你现在的程序是等于,在client端发了“A1”回车后,client端会阻塞,不能输入“B1”等
输了“A1”后,server现在会马上显示“A1”,但client要等server回话才可以继续输入“B1”等。
afgkidy 2006-06-01
  • 打赏
  • 举报
回复
给个我的程序参考下:程序能实现你所要的要求,自己理解吧
服务器:
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
import java.io.IOException;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class ServerTest implements Runnable
{
Thread thread;

public void run()
{
try
{
String str;
//创建服务器Socket并侦听端口8888
ServerSocket serverSocket=new ServerSocket (8888);
//接受客户端的连接
Socket socket=serverSocket.accept();

DataInputStream inStream=new DataInputStream(socket.getInputStream());
DataOutputStream outStream=new DataOutputStream (socket.getOutputStream());
InetAddress addr=socket.getInetAddress();
System.out.println("接收到来自 "+addr.getHostAddress()+" 的连接");
//发送响应信息
outStream.writeUTF("1");

while (true)
{
//接收客户端的信息
str=inStream.readUTF();
System.out.println("客户端信息: "+str);
str=String.valueOf(Integer.parseInt(str)+1);
//向客户端发送信息
outStream.writeUTF(str);
}
}

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

void start ()
{
thread=new Thread (this);
//线程开始
thread.start();
}

public static void main(String[] args)
{
ServerTest app=new ServerTest();
app.start();
}

客户端:
import java.net.Socket;
import java.net.InetAddress;
import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.io.IOException;

public class ClientTest implements Runnable
{
Thread thread;

public void run()
{
Socket socket;
DataOutputStream outStream;
DataInputStream inStream;

try
{
//连接到本地机的8888端口
socket=new Socket("localhost",8888);
outStream=new DataOutputStream (socket.getOutputStream());
inStream=new DataInputStream (socket.getInputStream());
InetAddress addr=socket.getInetAddress();
System.out.println("连接到服务器 "+addr.getHostAddress());

while (true)
{
//从服务器读取数据
String str=inStream.readUTF();
System.out.println("服务器端信息: "+str);
thread.sleep(1000);
str=String.valueOf(Integer.parseInt(str)+1);
//向服务器发送数据
outStream.writeUTF(str);
}

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

catch (InterruptedException e)
{
System.out.println(e);
}
}

void start ()
{
thread=new Thread(this);
//打开线程
thread.start();
}

public static void main(String[] args)
{
ClientTest app=new ClientTest();
app.start();
}
flybirdlc 2006-06-01
  • 打赏
  • 举报
回复
就是 socket 和socketserver 写在一个程序里~
flybirdlc 2006-06-01
  • 打赏
  • 举报
回复
你写程序的时候要写一个 socket 还要写一个 socketserver
一个用来发,一个用来收。socketserver 写在循环里,让他永远不停的接收
然后socket 写在触发里
这样就可以了~

62,614

社区成员

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

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