如何开发一个SocketServer-Client模型的程序


   开发原理:

   服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

   客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

   {建立服务器}

package org.tx;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class socketServer
{
 ArrayList clientList = new ArrayList();
 
 public static void main(String[] args)
 {
  //在main函数中,启动服务器的socket
  new socketServer().OpenServer();
  
 }
 
 public void OpenServer()//启动socketServer
 {
  try
  {
   ServerSocket server = new ServerSocket(10001);//端口设为10001
   
   Socket socket;
   while((socket = server.accept())!=null)
   {
     clientList.add(socket);
     //clientName = socket.getInetAddress().toString();
     //output = new DataOutputStream(socket.getOutputStream());
     //input = new DataInputStream(socket.getInputStream());
     new readClient(socket).start();
     new writeClient(socket).start();
   }
  }
  catch(Exception e)
  {System.out.println(e.toString());}
 }
 
 public class readClient extends Thread
 {
  private Socket socket;
  
  public readClient(Socket client)
  {socket = client;}
  
  public void run()
  {
   String msg;
   try
   {
    String clientName = socket.getInetAddress().toString();
    DataOutputStream output = new DataOutputStream(socket.getOutputStream());
    DataInputStream input = new DataInputStream(socket.getInputStream());
    while((msg = input.readUTF())!=null)
    {
     System.out.println("收到消息:【"+clientName+"】 "+msg); 
    }
   }
   catch(Exception e){System.out.println(e.toString());}
  } 
 }
 
 public class writeClient extends Thread
 {
  private Socket socket;
  
  public writeClient(Socket client)
  {socket = client;}
 
  public void run()
  {
   try{
    
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
    String userInput;
    String clientName = socket.getInetAddress().toString();
    DataOutputStream output = new DataOutputStream(socket.getOutputStream());
    DataInputStream input = new DataInputStream(socket.getInputStream());
    while(true)
    {
     if(stdIn.ready())
     {
      userInput = stdIn.readLine();
      if(userInput!="exit")
      {
       output.writeUTF(userInput);
       System.out.println("已发送消息给【"+clientName+"】"+userInput);
      }
     }
    }
   }
   catch(Exception e) {System.out.println(e.toString());}
  }
 }
 
}

   这个程序建立了一个服务器,它一直监听10001端口,等待用户连接。在建立连接后给客户端返回一段信息,然后结束会话。这个程序一次只能接受一个客户连接。


   {建立客户端}

package org.tx;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class socketClient
{
 private DataOutputStream output;
 private DataInputStream input;
 private String clientName;
 
 public static void main(String[] args)
 {
  //在main函数中,启动服务器的socket
  new socketClient().ConnectServer();
 }
 
 public void ConnectServer()
 {
  try
  {
   Socket socket = new Socket("127.0.0.1",10001);//
   clientName = socket.getInetAddress().toString();
   input = new DataInputStream(socket.getInputStream());
   output = new DataOutputStream(socket.getOutputStream());
   
   new readServer().start();
   new writeServer().start();
  }
  catch(Exception e) {System.out.println(e.toString());}
 }
 
 public class readServer extends Thread
 {
  private Socket client;

  public void run()
  {
   String msg;
   try
   {
    while(true)
    {
     msg = input.readUTF();
     if(msg!=null)
      System.out.println("收到消息:【"+clientName+"】 "+msg); 
    }
   }
   catch(Exception e) {System.out.println(e.toString());}
  } 
 }
 
 public class writeServer extends Thread
 {
  private Socket client;

  
  public void run()
  {
   try
   {
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
    String userInput;
    while(true)
    {
     if(stdIn.ready())
     {
      userInput = stdIn.readLine();
      if(userInput!="exit")
      {
       output.writeUTF(userInput);
       System.out.println("已发送消息给【"+clientName+"】"+userInput);
      }
     }
    }
   }
   catch(Exception e) {System.out.println(e.toString());}
  }
 }
 
}


   多个客户同时连接,主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。运用Thread类或Runnable接口来实现是不错的办法。这个客户端连接到地址为xxx.xxx.xxx.xxx的服务器,端口为10001,并从键盘输入一行信息,发送到服务器,然后接受服务器的返回信息,最后结束会话。

posted on 2012-11-01 10:21  吴一达  阅读(142)  评论(0编辑  收藏  举报

导航