import java.io.*;
  import java.net.*;
  import java.applet.Applet;
  public class TalkServer{
    public static void main(String args[]) {
      try{
        ServerSocket server=null;
        try{ 
          server=new ServerSocket(8088); 
        //创建一个ServerSocket在端口8088监听客户请求
        }catch(Exception e) {
          System.out.println("can not listen to:"+e); 
        //出错,打印出错信息
        }        Socket socket=null;
        try{
          socket=server.accept(); 
          //使用accept()阻塞等待客户请求,有客户
          //请求到来则产生一个Socket对象,并继续执行
        }catch(Exception e) {
          System.out.println("Error."+e); 
          //出错,打印出错信息
        }
        String line;
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         //由Socket对象得到输入流,并构造相应的BufferedReader对象
        PrintWriter os=newPrintWriter(socket.getOutputStream());
         //由Socket对象得到输出流,并构造PrintWriter对象
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
         //由系统标准输入设备构造BufferedReader对象        System.out.println("Client:"+is.readLine()); 
        //在标准输出上打印从客户端读入的字符串
        line=sin.readLine(); 
        //从标准输入读入一字符串
        while(!line.equals("bye")){ 
        //如果该字符串为 "bye",则停止循环
          os.println(line); 
          //向客户端输出该字符串
          os.flush(); 
          //刷新输出流,使Client马上收到该字符串
          System.out.println("Server:"+line); 
          //在系统标准输出上打印读入的字符串
          System.out.println("Client:"+is.readLine());
          //从Client读入一字符串,并打印到标准输出上
          line=sin.readLine(); 
          //从系统标准输入读入一字符串
        }  //继续循环
        os.close(); //关闭Socket输出流
        is.close(); //关闭Socket输入流
        socket.close(); //关闭Socket
        server.close(); //关闭ServerSocket
      }catch(Exception e){
        System.out.println("Error:"+e); 
        //出错,打印出错信息
      }
    }
  }这是单线程的
求解多线程。。

解决方案 »

  1.   

    求代码?呵呵
    你只给的server的代码啊 呵呵。
    给你个思路吧,客户端用多线程的,在run里面 发送字符串和接受字符串,然后主函数里面建立线程对象,可以限制最大数量。服务器端每监听到一个线程就建立一个服务线程。
      

  2.   

    public class Servicer implements Runnable { private Socket s;
    public Servicer(Socket s)
    {
    this.s=s;
    }
    public void run() {
    // TODO Auto-generated method stub
    try {
    InputStream ips=s.getInputStream();
    OutputStream ops=s.getOutputStream();

    BufferedReader br=new BufferedReader(new 
    InputStreamReader(ips));

    //pw有缓冲区
    PrintWriter pw=new PrintWriter(ops,true);
    String strline;
    String strout;
    while(true)
    { strline=br.readLine();
    if(!strline.equalsIgnoreCase("esc"))
    {
    strout=new StringBuffer(strline).reverse().toString();// pw.flush();
    pw.println(strline+"---->"+strout); }
    else
    break; }
    br.close();
    pw.close();
    s.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }
    }
    public class Server { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    try {
    ServerSocket ss=new ServerSocket(8088);
    boolean buruning=true;
    while(buruning)
    {
    Socket s=ss.accept();
    new Thread(new Servicer(s)).start();
    }

    ss.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } }}
      

  3.   

    import java.io.*;
    import java.net.*;public class TalkClient {
    public static void main(String args[]) {
    try {
    Socket socket = new Socket("127.0.0.1", 8088); BufferedReader sin = new BufferedReader(new InputStreamReader(
    System.in)); PrintWriter os = new PrintWriter(socket.getOutputStream()); BufferedReader is = new BufferedReader(new InputStreamReader(socket
    .getInputStream())); String readline;
    readline = sin.readLine();
    while (!readline.equals("bye")) { os.println(readline); os.flush(); System.out.println("Client:" + readline); System.out.println("Server:" + is.readLine()); readline = sin.readLine();
    }
    os.close();
    is.close();
    socket.close();
    } catch (Exception e) {
    System.out.println("Error" + e); 
    }
    }
    }
    这个是客户端滴
      

  4.   

    很简单啊,封装一个线程类,里头设一个成员变量Socket,把ServerSocket.accept()到的socket传给这个线程,然后把原来ServerSocket.accept()后的代码放到这个线程类中就可以了
      

  5.   

    1、服务器端程序
    服务器在获得客户端的连接请求之后他建一个 Socket对象,同时创建一个和客户端对话的线程,线程完成的主要功能是显示接收的信息,同进转换信息再进行对客户端的发送。
    程序“ServerPoint.java”
    import java.net.*;
    import java.util.*;
    import java.io.*;/**-----------------------------------
    * <br>功能概述:服务器监听线程
    ------------------------------------*/
    public class ServerPoint extends Thread{
    static int SERVERPORT = 8088;public ServerPoint(){
    }//ServerPoint()  
      public void run(){
           
    ClientThread.log("服务器端程序启动....");
    try{InetAddress ia = InetAddress.getLocalHost();   
       ClientThread.log("服务器的IP地址:" + ia.getHostAddress());
    ServerSocket server = new ServerSocket (SERVERPORT);
    //保持监听
    while(true){
    Socket client = server.accept();                 
            //创造一个线程
            ClientThread ct = new ClientThread(client);
            ct.start();
    }
    }
    catch( Exception e ){
    ClientThread.log("服务器端程序关闭....");
            System.exit(0);
    }
    }//run()public static void main(String arg[]){
    ServerPoint sp = new ServerPoint();
    sp.start(); 
    }//main()
    }/** ServerPoint *//**-----------------------------------
    * <br>功能概述:实现和一个客户的对话线程
    ------------------------------------*/
    class ClientThread extends Thread{
    private Socket s;
    public ClientThread(Socket s){
    this.s = s;
    }//ClientThread()public void run(){
    try{
    //接收消息流对象
    BufferedReader brSocketReader = new BufferedReader(
    new InputStreamReader(s.getInputStream()));
    //发送消息流对象
    PrintWriter pwSocketWriter = new PrintWriter(
           new OutputStreamWriter(s.getOutputStream()),true);
    String strGetMSG = brSocketReader.readLine();
    log("客户端发送来的信息是:" + strGetMSG);
    //发送反馈信息
    pwSocketWriter.println(getFeedBackInfo(strGetMSG));brSocketReader.close();
    pwSocketWriter.close();
    s.close();
    }
    catch(Exception e){
    e.printStackTrace();
    }
    }//run()static void log(String strInfo){
    System.out.println(strInfo);
    }//log()public String getFeedBackInfo(String strInfo){
    String s = "";
    for(int i=strInfo.length()-1;i>=0;i--){
    s += String.valueOf(strInfo.charAt(i));
    }
    log("反馈信息是:" + s);
    return s;
    }//getFeedBackInfo()
    }/** ClientThread */
      

  6.   

    2、客户端程序
    客户端程序就是实现在jSendButton的动作事件发生之后。与服务器创建连接,然后发送jTexSendInfo文本域内的信息,并将接收的反馈信息显示在jTextGetInfo文本域内。
    程序“ClientPoint.java”
    import javax.swing.*;
    import java.awt.event.*;
    import java.io.*;
    import java.net.*;
    import java.awt.*;/**-----------------------------------
    * <br>功能概述:客户端程序
    ------------------------------------*/
    public class ClientPoint extends JFrame {  //指定服务器套接口的地址和绑定端口号
      static int SERVERPORT = 8088;
      static String SERVERADDRESS = "192.168.1.109";
      
      //界面编程部分
      private JPanel jPanel1 = new JPanel();
      private JTextField jTextSendInfo = new JTextField(25);
      private JTextField jTextGetInfo = new JTextField(25);
      private JButton jSendButton = new JButton("发送");
      private JButton jClsButton = new JButton("清除");  public ClientPoint(){
         super("客户端应用程序");
         enableEvents(AWTEvent.WINDOW_EVENT_MASK);
         setSize(300,150);
         jPanel1.add(jTextSendInfo);
         jPanel1.add(jTextGetInfo);
         jTextGetInfo.setEditable(false);
         jPanel1.add(jSendButton);
         jPanel1.add(jClsButton);
         jSendButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
             //发送信息,并获得反馈信息进行显示
             MessageOperate();
           }
         });
        jClsButton.addActionListener(new ActionListener() {
           public void actionPerformed(ActionEvent e) {
             jTextSendInfo.setText("");
             jTextGetInfo.setText("");
           }
         });
         this.setContentPane(jPanel1);
    }//ClientPoint()  /**-----------------------------------
      * <br>功能概述:实现发送信息,获得反馈信息进行显示
      ------------------------------------*/
      public void MessageOperate(){
       try{
    Socket client = new Socket(SERVERADDRESS,SERVERPORT);   
    //接收消息流对象
    BufferedReader brSocketReader = new BufferedReader(
    new InputStreamReader( client.getInputStream()));
    //发送消息流对象
    PrintWriter pwSocketWriter = new PrintWriter(
           new OutputStreamWriter(client.getOutputStream()),true);
    //发送jTextSendInfo消息
    pwSocketWriter.println(jTextSendInfo.getText());
    //获得反馈信息       
    String strGetMSG = brSocketReader.readLine();
    //显示反馈信息
    jTextGetInfo.setText(strGetMSG);
    brSocketReader.close();
    pwSocketWriter.close();
    client.close();
    }
    catch(Exception e){
    e.printStackTrace();
    }
      }//MessageOperate()
      
      /**-----------------------------------
      * <br>功能概述:实现窗口关闭
      ------------------------------------*/
      protected void processWindowEvent(WindowEvent e) {
          if (e.getID() == WindowEvent.WINDOW_CLOSING) {
         //程序关闭
         System.exit(0);
          }
          super.processWindowEvent(e);
      }//processWindowEvent()
      
      public static void main(String[] args) {
         ClientPoint cp = new ClientPoint();
    cp.show();
      }//main()
        
    }/** ClientPoint */