本帖最后由 叶征东 于 2012-9-18 12:08 编辑
首先,我说下个人理解,就是一个服务器可以同时和多个客户端进行数据的交互,注意,只有一个服务器.
服务端实现多线线程的方式,将进行数据交互部分进行单独封装,放在一个实现了Runnable接口的类的run()中;
我认为你的代码中有问题的部分:
Socket s = new Socket("192.168.1.1",10011);
ServerSocket ss = new ServerSocket(10011);
new Thread(new TcpServer(ss)).start();//我觉得是一个服务器中有多个线程,帮它处理与客户端的数据交互,线程应该是包含在服务器中的.你这样写,我觉得怪怪的,但也说不清楚到底哪里不好,
下面是我改动后的代码:
import java.net.*;
import java.io.*;
public class SocketDemo2 {
public static void main(String[] args) throws Exception
{
Socket s = new Socket("192.168.1.111",10011);
Socket s2 = new Socket("192.168.1.111",10011);
Socket s3 = new Socket("192.168.1.111",10011);
new Thread(new Client(s)).start();//-------多个客户端访问服务器
new Thread(new Client(s2)).start();
new Thread(new Client(s3)).start();
}
}
class Client implements Runnable//定义客户端,这部分我没有改动,就是你的TcpSocket部分
{
private Socket s;
Client(Socket s)
{
this.s = s;
}
public void run()
{
try
{
Thread.sleep(80); //----------------------------------------尝试用wait让服务端先开启也不行!
OutputStream out = s.getOutputStream();
out.write("我来了".getBytes());
InputStream in = s.getInputStream();
byte[]buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
catch (IOException e)
{
throw new RuntimeException();
}
catch (InterruptedException e)
{//--------------------------catch wait的异常
e.printStackTrace();
}
}
}
class TcpServer
{
public static void main(String[] args)throws Exception
{
show();
}
public static void show()throws Exception
{
ServerSocket ss = new ServerSocket(10011); //--------创建好一个服务器
while (true)
{
//----每有一个客户端来访问,就会创建一个线程与其进行数据交互,
Socket s=ss.accept();
new Thread(new TcpThread(s)).start();
}
}
}
class TcpThread implements Runnable//------将服务器中的数据交互部分进行封装
{
private Socket s;
TcpThread(Socket s)
{
this.s=s;
}
public void run()
{
String ip=s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+"...connected");
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(ip+"````"+new String(buf,0,len));
OutputStream out = s.getOutputStream();
out.write("收到了".getBytes());
s.close();
}
catch (Exception e)
{
throw new RuntimeException();
}
}
}
这样改动后,我试了是有用的,
注:我用的是命令行,编译可以在一起,运行是在两个命令行页面上进行的,先"java TcpServer",再到另一个页面上"java SocketDemo2",
还有将IP改下,我用的是我自己的
不知道我这样理解是不是对的,如果要是错了,烦请楼主回复,提醒我,谢谢!
|