我刚接触SOCKET
网上的通过SOCKET连接的C/S结构的简单聊天程序
大多是采取一问一答形式
即client对server说完话后,要等待server回应才可以继续说
反之亦然如何可以做到双方可以随时发话?(不用UDP连接方式实现)设想是client建两个socket分别进行收和发
但发现server好象很难识别哪个socket是做什么的。谁有好的方法,告诉一下,谢谢!
网上的通过SOCKET连接的C/S结构的简单聊天程序
大多是采取一问一答形式
即client对server说完话后,要等待server回应才可以继续说
反之亦然如何可以做到双方可以随时发话?(不用UDP连接方式实现)设想是client建两个socket分别进行收和发
但发现server好象很难识别哪个socket是做什么的。谁有好的方法,告诉一下,谢谢!
一个用来发,一个用来收。socketserver 写在循环里,让他永远不停的接收
然后socket 写在触发里
这样就可以了~
服务器:
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();
}
我把client那的sleep设成了10秒
那么server端还是要等client端的线程完成一个循环才会执行server端那些代码我要的效果是,例如:
我先在client端发:“A1”回车;“B1”回车;“C1”回车。
server端在可以输入的状态下,仍然可以显示出“A1”,“B1”,“C1”。你现在的程序是等于,在client端发了“A1”回车后,client端会阻塞,不能输入“B1”等
输了“A1”后,server现在会马上显示“A1”,但client要等server回话才可以继续输入“B1”等。
client每10秒向server发出信息,server再刚才每1秒发出消息的同时
每隔10秒显示client发出的信息