Android:網絡編程

不多嗶嗶,就是JAVA網絡編程內容,一個多線程聊天室包含了所有內容。

一,一對一

服務端


import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ServerTPC extends JFrame {
	private JTextField enterField;
	private JTextArea displayArea;
	private ObjectOutputStream output;
	private ObjectInputStream input;
	private ServerSocket server;
	private Socket connection;
	private JButton but;
	private JPanel panel;
	public ServerTPC() {
		super("管理員");
		panel = new JPanel(new FlowLayout());
		but = new JButton("發送");
		Container container = getContentPane();
		enterField = new JTextField(20);
		enterField.setEditable(false);
		enterField.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				sendData(e.getActionCommand());
				enterField.setText("");
			}
		});
		but.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				sendData(e.getActionCommand());
				enterField.setText("");
			}
		});
		try {
			server = new ServerSocket(8080);
		} catch (IOException e1) {
			JOptionPane.showMessageDialog(null, "端口被佔用請 重新選擇", "提示", JOptionPane.INFORMATION_MESSAGE);
		}
		panel.add(enterField);
		panel.add(but);
		container.add(panel, BorderLayout.SOUTH);
		displayArea = new JTextArea();
		displayArea.setEditable(false);

		container.add(new JScrollPane(displayArea), BorderLayout.CENTER);
		setBounds(600, 200, 500, 250);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Thread a = new Thread(new Roll());
		a.start();
	}
	class Roll implements Runnable {
		public void run() {
			try {
				while (true) {
					try {
						waitForConnection();
						getStreams();
						processConnection();
					} catch (EOFException e) {
						System.out.println("這裏發生了錯誤請及時修復");
					} finally {
						closeConnection();
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	private void waitForConnection() throws IOException {
		displayMessage("等待用戶接入");
		connection = server.accept();
	}

	private void getStreams() throws IOException {
		output = new ObjectOutputStream(connection.getOutputStream());
		output.flush();
		input = new ObjectInputStream(connection.getInputStream());
	}

	private void processConnection() throws IOException {
		String message = "連接成功";
		sendData(message);
		setTextFieldEditable(true);
		try {
			do {
				message = (String) input.readObject();
				displayMessage("\n" + message);
			} while (true);
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "好友已下線", "提示", JOptionPane.INFORMATION_MESSAGE);
		}
	}
	
	private void closeConnection() {
		displayMessage("對話結束\n");
		setTextFieldEditable(false);
		try {
			output.close();
			input.close();
			connection.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void sendData(String message) {
		try {
			Date date = new Date();
			SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
			output.writeObject("管理員:" + sf.format(date) + "\n" + message);
			output.flush();
			displayMessage("\n管理員:" + sf.format(date) + "\n" + message);
		} catch (Exception e) {
			displayArea.append("\n發生錯誤");
		}
	}

	private void displayMessage(final String messageToDisplay) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				displayArea.append(messageToDisplay);
				displayArea.setCaretPosition(displayArea.getText().length());
			}
		});
	}

	private void setTextFieldEditable(final boolean editable) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				enterField.setEditable(editable);
			}
		});
	}
	public static void main(String[] args) {
		ServerTPC a = new ServerTPC();
	}
}

客戶端

import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ClientTPC extends JFrame{
	private JTextField enterField;
	private JTextArea displayArea;
	private ObjectOutputStream output;
	private ObjectInputStream input;
	private String message="";
	private String chatServer,userName;
	private Socket client;
	private JButton but;
	private JPanel panel;
	private int server;
	public ClientTPC() {
		super("客戶");but=new JButton("發送");
		panel=new JPanel(new FlowLayout());
		chatServer="127.0.0.1";	//ip
		server=8080;	//端口
		userName="燕雙嚶";
		Container c=getContentPane();
		enterField=new JTextField(20);
		enterField.setEditable(false);
		enterField.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						sendData(e.getActionCommand());
						enterField.setText( "" );
					}
				});
		panel.add(enterField);
		panel.add(but);
		c.add(panel,BorderLayout.SOUTH);
		displayArea=new JTextArea();
		displayArea.setEditable(false);
		c.add(new JScrollPane(displayArea),BorderLayout.CENTER);
		setBounds(600, 200, 500, 250);
		setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		Thread a=new Thread(new Roll());
		a.start();
	}
	class Roll implements Runnable{
		public void run() {
			try {
				connectionToServer();
				getStreams();
				processConnection();
			} catch (EOFException e1) {
				System.out.println("客戶斷開連接");
			} catch(IOException e2) {
				e2.printStackTrace();
			} finally {
				closeConnection();
			}
		}
	}
	private void connectionToServer() throws IOException{
		displayMessage("嘗試連接");
		client=new Socket(chatServer,server);
	}
	private void getStreams() throws IOException{
		output=new ObjectOutputStream(client.getOutputStream());
		output.flush();
		input=new ObjectInputStream(client.getInputStream());
	}
	private void processConnection()throws IOException{
		setTextFieldEditable(true);
		try {do {
			
				message=(String)input.readObject();
				displayMessage("\n"+message);
			
			} while (true);
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "服務器已關閉", "提示", JOptionPane.INFORMATION_MESSAGE);
		}
	}
	private void closeConnection() { 
		displayMessage("\n斷開連接");
		setTextFieldEditable(false);
		try {
			output.close();
			input.close();
			client.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	private void sendData(String message) {
		try {
			Date date = new Date();
			SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
			output.writeObject(userName+":"+sf.format(date)+"\n"+message);
			output.flush();
			displayMessage("\n"+userName+":"+sf.format(date)+"\n"+message);
		} catch (Exception e) {
			displayArea.append("\n發生了錯誤");
		}
	}
	private void displayMessage(final String messageToDisplay) {
		SwingUtilities.invokeLater(
				new Runnable() {
					public void run() {
						displayArea.append(messageToDisplay);
						displayArea.setCaretPosition(displayArea.getText().length());
					}
				});
	}
	private void setTextFieldEditable(final boolean editable) {
		SwingUtilities.invokeLater(
				new Runnable() {
					public void run() {
						enterField.setEditable(editable);
					}
				});
	}
	public static void main(String[] args) {
		ClientTPC a =new ClientTPC();
	}
}

二,多人聊天

服務端

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.JOptionPane;

public class Server {
	private ServerSocket serverSocket;
	private HashSet<Socket> allSockets;

	public Server() {
		try {
			serverSocket = new ServerSocket(8080);
			JOptionPane.showMessageDialog(null, "服務器已啓動\n請運行客戶端", "提示", JOptionPane.INFORMATION_MESSAGE);
		} catch (Exception e) {
			e.printStackTrace();
		}
		allSockets = new HashSet<Socket>();
		try {
			startService();
		} catch (IOException e) {
		System.out.println("錯誤");
		}
	}

	public void startService() throws IOException {
		while (true) {
			Socket s = serverSocket.accept();
			System.out.println("用戶已進入聊天室");
			allSockets.add(s);
			new ServerThread(s).start();
		}
	}
	private class ServerThread extends Thread {
		Socket socket;

		public ServerThread(Socket socket) {
			this.socket = socket;
		}
		public void run() {
			BufferedReader br = null;
			try {
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				while (true) {
					String str = br.readLine();
					sendMessageTOAllClient(str);
				}
			} catch (Exception e) {
				System.out.println("用戶退出聊天室");
			}
		}
		public void sendMessageTOAllClient(String message) throws IOException {
			for (Socket s : allSockets) {
				PrintWriter pw = new PrintWriter(s.getOutputStream());
				pw.println(message);
				pw.flush();
			}
		}
	}

}

客戶端——界面


import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.*;
import javax.swing.border.EmptyBorder;


public class ClientFrame extends JFrame {
	private JPanel contentPane,panel;
	private JTextField tfMessage;
	private JButton btnSend;
	private JTextArea textArea;
	private String userName,ip;
	private int i;
	private ChatRoomClient client;
	public ClientFrame() {
		textArea=new JTextArea(10,10);
		textArea.setEditable(false);
		tfMessage =new JTextField(20);
		btnSend = new JButton("發送");
		userName = "燕雙嚶";
		ip = "127.0.0.1";
		i = 8080;
		try {
			client = new ChatRoomClient(ip, i);
			textArea.setText("連接成功\n");
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e2) {
			e2.printStackTrace();
		}
		
		setTitle("客戶端");
		
		tfMessage.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Date date = new Date();
				SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
				client.sendMessage(userName + ":" + sf.format(date) + ":\n" + tfMessage.getText());
				tfMessage.setText("");
				
			}
		});
		
		btnSend.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				Date date = new Date();
				SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
				client.sendMessage(userName + ":" + sf.format(date) + ":\n" + tfMessage.getText());
				tfMessage.setText("");
			}
		});
		
		this.userName = userName;
		ReadMessageThread messageThread = new ReadMessageThread();
		messageThread.start();	
		
		Container c=getContentPane();
		contentPane = new JPanel();
		contentPane.setLayout(new BorderLayout());
		panel = new JPanel();
		panel.setLayout(new FlowLayout());
		
		contentPane.add(new JScrollPane(textArea),BorderLayout.CENTER);
		panel.add(tfMessage);
		panel.add(btnSend);
		contentPane.add(panel,BorderLayout.SOUTH);
		c.add(contentPane);
		
		setBounds(100, 100, 450, 300);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
	}
	private class ReadMessageThread extends Thread {

		public void run() {
			while (true) {
				String str = client.reciveMessage();
				textArea.append(str + "\n");
			}
		}
	}

}

客戶端——方法類


import java.io.*;
import java.net.*;

public class ChatRoomClient {
	private Socket socket;
	private BufferedReader bufferReader;
	private PrintWriter pWriter;

	public ChatRoomClient(String host, int port) throws UnknownHostException, IOException {
		socket = new Socket(host, port);
		bufferReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		pWriter = new PrintWriter(socket.getOutputStream());
	}

	public void sendMessage(String str) {
		pWriter.println(str);
		pWriter.flush();
	}

	public String reciveMessage() {
		try {
			return bufferReader.readLine();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public void close() {
		try {
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

 

 

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