2.4,TCP程序例子改进后的服务器程序:
大多数情况下,服务器端都要服务多个客户端,但一次accept方法调用只接收一个连接,因此,要把accept方法放在一个循环语句中,这样就可以接收多个连接.每个连接的数据交换代码也放在一个循环中,这样才能保证两者可以不停地交换数据.
每个连接的数据交换代码必须放在独立的线程中运行,否则,这在段代码运行期间,就没法执行其他的程序代码,accept方法也得不到调用,新的连接无法进入.
下面是一个例子,客户端向服务器发送一个字符串,服务器将这个字符串中的所有字符反向排列后回送给客户端.客户端输入"quit",退出程序.
import Java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8000);
while(true){
Socket s = ss.accept();
new Thread(new Servicer(s)).start();
}
}
}
class Servicer implements Runnable{
Socket s;
public Servicer(Socket s){
this.s = s;
}
public void run(){
try{
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos = new DataOutputStream(ops);
while(true){
String strWord = br.readLine();
if(strWord.equalsIgnoreCase("quit")){
break;
}
String strEcho = (new StringBuffer(strWord).reverse().toString());
dos.writeBytes(strWord + "------->" + strEcho + System.getProperty("line.separator"));
}
br.close();
dos.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
2.5,TCP程序例子客户端程序:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws Exception{
if(args.length < 2){
System.out.println("Usage:java TcpClient ServerIP ServerPort");
return ;
}
Socket s = new Socket(InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
while(true){
String strWord = brKey.readLine();
dos.writeBytes(strWord + System.getProperty("line.separator"));
if("quit".equalsIgnoreCase(strWord)){
break;
}else{
System.out.println(brNet.readLine());
}
}
dos.close();
brNet.close();
brKey.close();
s.close();
}
}
先运行服务器程序,再在命令行使用java TcpClient 192.168.0.3 8000,这样就启动了客户端程序.我们可以启动多个客户端程序.
我们可以利用netstat工具来查看已经被使用的端口。