问题:Refactoring following simple socket server to mutil thread server.
package test7;import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SimpleServer {
public static void main(String [] args){
ServerSocket s = null;
Socket s1;
String sendString = "Hello Net World";
OutputStream slout;
DataOutputStream dos;
try{
s = new ServerSocket(5432);
}catch(Exception ex){ }
while(true){
try {
s1 = s.accept();
slout = s1.getOutputStream();
dos = new DataOutputStream(slout);
dos.writeUTF(sendString);
s1.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

解决方案 »

  1.   


    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;public class MutiServer implements Runnable {
    private Socket socket; public MutiServer(Socket socket) {
    this.socket = socket; }
    public void run() {
    try { // 建议将DataInputStream换成BufferedReader
    while (true) {
    BufferedReader readBuffer = new BufferedReader(
    new InputStreamReader(socket.getInputStream()));
    PrintStream writeStream = new PrintStream(socket
    .getOutputStream());
    System.out.println(readBuffer.readLine());
    writeStream.println("Hello Net World"); }
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    try {
    socket.close();
    } catch (Exception ee) {
    ee.printStackTrace();
    }
    }
    } public static void main(String[] args) {
    ServerSocket s = null;
    Socket s1;
    try {
    s = new ServerSocket(5432);
    } catch (Exception ex) {
    }
    while (true) {
    try {
    s1 = s.accept();
    new Thread(new MutiServer(s1)).start(); } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }}
      

  2.   

    import java.io.BufferedWriter;
    import java.io.DataOutputStream; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.io.OutputStreamWriter;
    import java.net.ServerSocket; 
    import java.net.Socket; public class SimpleServer { 
    public static void main(String [] args){ 
    ServerSocket s = null; 
    Socket s1; 
    String sendString = "Hello Net World"; 
    OutputStream slout; 
    DataOutputStream dos; 
    try{ 
    s = new ServerSocket(5432); 
    }catch(Exception ex){ } 
    try { 
    s1 = s.accept(); 
    slout = s1.getOutputStream(); 
    dos = new DataOutputStream(slout); 
    BufferedWriter out=new BufferedWriter(new OutputStreamWriter(dos));
    out.write(sendString);
    out.flush();
    out.close();
    s1.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 




    应该用字符流处理的!
      

  3.   

    BufferedReader和PrintStream 是按行读和写,这个应该知道吧
      

  4.   


    while (true) {
    BufferedReader readBuffer = new BufferedReader(
    new InputStreamReader(socket.getInputStream()));
    PrintStream writeStream = new PrintStream(socket
    .getOutputStream());
    System.out.println(readBuffer.readLine());
    writeStream.println("Hello Net World");
    writeStream.flush();//刚才少了这句子 }
      

  5.   

    给你一段聊天室代码,你看看//服务端
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    import java.net.BindException;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.net.SocketException;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Observable;
    import java.util.Observer;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.ScrollPaneConstants;public class ChatServer extends Observable implements Serializable {
    JTextArea jtArea = new JTextArea();
    JTextArea clientInfo = new JTextArea();
    List<ConnectClient> clientList = new ArrayList<ConnectClient>(); public static void main(String[] args) {
    new ChatServer().newServer();
    } public void addText(String s) {
    // jtArea.append(s + "\n");
    this.setChanged();
    this.notifyObservers(s);
    } public void newServer() {
    JFrame jf = new JFrame();
    jf.setLayout(new GridLayout(1, 2));
    jf.setTitle("简易聊天服务端1.0");
    this.jtArea.setEditable(false);
    this.clientInfo.setEditable(false);
    JScrollPane jsp = new JScrollPane(jtArea);
    jsp
    .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    JScrollPane jspInfo = new JScrollPane(clientInfo);
    jspInfo
    .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    jf.add(jspInfo);
    jf.add(jsp);
    jf.setBounds(150, 100, 400, 500);
    jf.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    jf.setVisible(true);
    startSever();
    } public void startSever() {
    ServerSocket server = null;
    try {
    server = new ServerSocket(8788);
    jtArea.append("服务器启动成功....." + "\n");
    new Thread(new updataClients()).start();
    while (true) {
    Socket s = server.accept();
    ConnectClient cc = new ConnectClient(s);
    clientList.add(cc);
    addText(cc.getName() + ":" + new Date() + ":" + "连接到服务器");
    jtArea.append(cc.getName() + ":" + s.getInetAddress() + ":"
    + s.getPort() + ":" + "连接到服务器" + ":" + new Date()
    + "\n");
    this.addObserver(cc);
    new Thread(cc).start();
    }
    } catch (BindException e) {
    jtArea.append("端口被占用,请退出" + "\n");
    } catch (IOException e) {
    jtArea.append("服务器启动失败,请退出" + "\n");
    e.printStackTrace();
    }
    } class ConnectClient implements Runnable, Observer, Serializable {
    private boolean beConneted = false;
    private transient Socket s = null;
    private transient DataInputStream dis = null;
    private transient DataOutputStream dos = null;
    private String name = null; public String getName() {
    return name;
    } public ConnectClient(Socket ss) {
    this.s = ss;
    this.name = name;
    beConneted = true;
    try {
    dis = new DataInputStream(s.getInputStream());
    dos = new DataOutputStream(s.getOutputStream());
    name = dis.readUTF();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public void sendMes(String s) {
    try {
    if (beConneted)
    dos.writeUTF(s);
    } catch (IOException e) { }
    } @Override
    public void run() {
    try {
    while (beConneted) {
    String ss = dis.readUTF();
    addText(name + ":" + ss + "      " + new Date());
    }
    } catch (SocketException e) {
    addText(name + ":" + "断开" + ":" + new Date());
    jtArea.append(name + ":" + s.getInetAddress() + ":"
    + s.getPort() + ":" + "断开" + ":" + new Date() + "\n");
    clientList.remove(this);
    beConneted = false;
    } catch (IOException e) {
    } finally {
    try {
    if (dos != null)
    dos.close();
    if (dis != null)
    dis.close();
    if (s != null)
    s.close();
    beConneted = false;
    clientList.remove(this);
    deleteObserver(this);
    } catch (IOException e1) {
    e1.printStackTrace();
    }
    }
    } @Override
    public void update(Observable o, Object arg) {
    String temp = (String) arg;
    // System.out.println(temp);
    this.sendMes(temp);
    }
    } class updataClients implements Runnable {
    @Override
    public void run() {
    while (true) {
    updataInfo();
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    } public void updataInfo() {
    ObjectOutputStream oos = null;
    clientInfo.setText("");
    String temp = null;
    for (int i = 0; i < clientList.size(); i++) {
    ConnectClient cc = clientList.get(i);
    temp = cc.getName();
    clientInfo.append(temp + "\n");
    }
    } }
    }
      

  6.   

    //客户端
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;import javax.swing.DefaultComboBoxModel;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.ScrollPaneConstants;
    public class ChatClient extends JFrame {
    boolean beConnected = false;
    Socket s = null;
    DataOutputStream dos = null;
    DataInputStream dis = null;
    JTextField serIPText = new JTextField(10);
    JTextField nameText = new JTextField(5);
    JTextArea jtArea = new JTextArea();
    JTextField jtField = new JTextField(40);
    JButton conJB = new JButton("连接");
    DefaultComboBoxModel dcbm=null; public static void main(String[] args) {
    new ChatClient().newClient();
    } public void newClient() {
    this.setTitle("简易聊天客户端1.0");
    JPanel jp = new JPanel();
    jp.add(serIPText);
    jp.add(nameText);
    conJB.addActionListener(new JBListener());
    jp.add(conJB);
    this.jtField.addActionListener(new TFListener());
    this.jtArea.setEditable(false);
    JScrollPane jsp = new JScrollPane(jtArea);
    jsp
    .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    this.add(jp, BorderLayout.NORTH);
    this.add(jsp);
    JPanel jpSouth=new JPanel();
    jpSouth.add(jtField);
    dcbm=new DefaultComboBoxModel();
    //dcbm.addElement("All");
    JComboBox jb=new JComboBox(dcbm);
    jpSouth.add(jb);
    this.add(jpSouth, BorderLayout.SOUTH);
    this.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    this.setBounds(300, 100, 600, 480);
    this.setResizable(false);
    this.setVisible(true);
    } public void connect(String ip) {
    if (nameText.getText().trim().equals("")) {
    jtArea.append("请填入用户名" + "\n");
    } else {
    try {
    s = new Socket(ip, 8788);
    dos = new DataOutputStream(s.getOutputStream());
    dos.writeUTF(nameText.getText().trim());
    beConnected = true;
    conJB.setEnabled(false);
    // dos.close();
    jtArea.append("连接成功" + s.getInetAddress() + ":" + s.getPort()
    + new Date()+"\n");
    dis = new DataInputStream(s.getInputStream());
    new Thread(new ReceiveMes()).start();
    } catch (IOException e) {
    jtArea.append("连接错误...请退出" + "\n");
    disConnect();
    }
    }
    } public void disConnect() {
    try {
    if (dos != null)
    dos.close();
    if (dis != null)
    dis.close();
    if (s != null)
    s.close();
    s = null;
    beConnected = false;
    conJB.setEnabled(true);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } public void sendMes(String s) {
    try {
    if (beConnected) {
    dos.writeUTF(s);
    }
    } catch (IOException e1) {
    try {
    dos.close();
    beConnected = false;
    } catch (IOException e2) {
    e2.printStackTrace();
    }
    e1.printStackTrace();
    }
    } class TFListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    String temp = jtField.getText();
    sendMes(temp);
    jtField.setText("");
    }
    } class JBListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
    connect(serIPText.getText().trim());
    } } class ReceiveMes implements Runnable { @Override
    public void run() {
    while (beConnected) {
    try {
    String temp = dis.readUTF();
    jtArea.append(temp + "\n");
    } catch (IOException e) {
    disConnect();
    }
    }
    }
    }
    }