Socket is closed 可能原因

Exception in thread “main” java.net.SocketException: Socket is closed

io流關閉的同時socket也會關閉。
程序可以在最後關閉io流與socket流或者單獨設置一個函數隔離開來。
以下程序是通過TCP實現客戶端和服務器間的通信對話

package shiyan5;
import java.io.*;
import java.net.*;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class TCPTalk {
	public TCPTalk() throws Exception{
		Server s = new Server();
		User u = new User();
		s.setVisible(true);
		u.setVisible(true);
		s.server1();
		while(true) {
			u.server2();
			s.server();
		}
		
	}
	class Server extends JFrame{
		JLabel lbl;
		JTextField text;
		JButton btn1,btn2,btn3;
		ServerSocket serverSocket;
		Socket clientSocket = null;
		String str;
		DataInputStream  In = null;
		
		public Server() {
			this.setTitle("服務器");
			this.setBounds(200,200,400,400);
			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			this.setLayout(new GridLayout(3,1));
			lbl = new JLabel("等待啓動");
			text = new JTextField();
			btn1 = new JButton("連接");
			btn2 = new JButton("發送");
			btn3 = new JButton("停止");
			
			
			btn2.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						send();
					}catch (Exception e1){
						e1.printStackTrace();
					}
				}
			});
			
			btn3.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						stop();
					}catch (Exception e1){
						e1.printStackTrace();
					}
				}
			});
			
			add(lbl);
			add(text);
			add(btn1);
			add(btn2);
			add(btn3);
		}
		
		public void server1()throws Exception{
			serverSocket = new ServerSocket(5555);
			lbl.setText("等待連接");
			clientSocket = serverSocket.accept();
			lbl.setText("連接成功");
			In = new DataInputStream(clientSocket.getInputStream());
			str = In.readUTF();
			text.setText(str);
		}
		
		public void server()throws Exception{
//			serverSocket = new ServerSocket(5555);			
//			clientSocket = serverSocket.accept();
			In = new DataInputStream(clientSocket.getInputStream());
			str = In.readUTF();
			text.setText(str);
		}

		
		
		public void send()throws Exception{
			String s = text.getText();
			//BufferedReader reader = new BufferedReader(new FileReader(inFile));
			DataOutputStream out = new DataOutputStream(clientSocket.getOutputStream());
			out.writeUTF(s);
			System.out.println("服務器發送");
			//reader.close();
//			out.close();
//			clientSocket.close();
		}
		

		
		//
		public void stop()throws Exception{
			clientSocket.close();
			serverSocket.close();
			System.exit(0);
		}
	}
	
	class User extends JFrame{
		JLabel lbl;
		JTextField text;
		JButton btn1,btn2,btn3;
		ServerSocket serverSocket;
		Socket clientSocket2 = null;
		String str;
		DataInputStream  In = null;
		
		public  User() throws Exception{
			this.setTitle("客戶端");
			this.setBounds(800,200,400,400);
			this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			this.setLayout(new GridLayout(3,1));
			lbl = new JLabel("連接中。。。");
			text = new JTextField("請輸入信息:");
			btn1 = new JButton("連接");
			btn2 = new JButton("發送");
			btn3 = new JButton("停止");
			
			btn1.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						connect();
					}catch (UnknownHostException e1){
						e1.printStackTrace();
					}catch(Exception e1) {
						e1.printStackTrace();
					}
				}
			});
			
			
			btn2.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						send();
					}catch (Exception e1){
						e1.printStackTrace();
					}
				}
			});
			
			btn3.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					try {
						stop();
					}catch (Exception e1){
						e1.printStackTrace();
					}
				}
			});
			
			add(lbl);
			add(text);
			add(btn1);
			add(btn2);
			add(btn3);
		}
		//
		public void stop()throws Exception{
			clientSocket2.close();
			serverSocket.close();
			System.exit(0);
		}
		
		public void server2()throws Exception{		
			
			In = new DataInputStream(clientSocket2.getInputStream());
			str = In.readUTF();
			text.setText(str);
		}
	
		public void connect() throws UnknownHostException,Exception{
			clientSocket2 = new Socket("127.0.0.1",5555);
			lbl.setText("成功連接到服務器");
		}
		
		public void send()throws Exception{
			String s = text.getText();
			//BufferedReader reader = new BufferedReader(new FileReader(inFile));
			DataOutputStream out = new DataOutputStream(clientSocket2.getOutputStream());
			out.writeUTF(s);
			System.out.println("客戶端發送");
			//reader.close();
//			out.close();
//			clientSocket2.close();
		}
		

	}
	public static void main(String []args)throws Exception{
		TCPTalk tcp = new TCPTalk();
	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章