자바 C/S 모드 채 팅 방 실현(말 병사 채 팅 방 프로그램 에 따라 최적화)

7049 단어 자바C++cswingC#
말 병사 선생님 의 채 팅 방 프로그램 을 최적화 시 키 는 동시에 채 팅 자 간 의 상호작용 도 늘린다.
동시에 서버 를 추가 하면 모든 클 라 이언 트 에 게 상호작용 창 을 추가 하여 서버 가 모든 클 라 이언 트 와 상호작용 을 할 수 있 도록 합 니 다!
서버 코드
import java.net.*;
import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import javax.swing.JFrame;

public class ChatServer extends JFrame {
	JTextArea ta = new JTextArea();
	ServerSocket server = null;
	Collection cClient = new ArrayList();

	public ChatServer(int port) throws Exception {
		server = new ServerSocket(port);
		add(ta, BorderLayout.CENTER);
		setBounds(200, 200, 300, 450);
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});
		setVisible(true);
	}

	public void startServer() throws Exception {
		while (true) {
			Socket s = server.accept();
			cClient.add(new ClientConn(s));
			ta.append(s.getInetAddress().getHostName() + "  " + "    " + "   "
					+ s.getPort());
			ta.append("
" + " : " + cClient.size() + "

"); } } class ClientConn extends Frame implements Runnable, ActionListener { TextArea ta1 = null; TextArea ta2 = null; Button btn = null; Socket s = null; public ClientConn(Socket s) { ta1 = new TextArea(3, 30); ta2 = new TextArea(2, 15); btn = new Button(" "); this.setLayout(new BorderLayout()); this.add(ta1, BorderLayout.CENTER); this.add(ta2, BorderLayout.SOUTH); this.add(btn, BorderLayout.EAST); this.setSize(300, 200); this.setVisible(true); this.setTitle("" + s.getInetAddress().getHostName() + " " + s.getPort()); this.s = s; (new Thread(this)).start(); btn.addActionListener(this); } public void actionPerformed(ActionEvent e) { try { DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(" :
" + ta2.getText() + "
"); ta1.append(" :
" + ta2.getText() + "
"); ta2.setText(""); } catch (IOException E) { } } public void send(String str, String st) throws IOException { DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(st + " :
" + str); } public void dispose() { try { // this.setVisible(false); super.dispose(); ta.append(s.getInetAddress().getHostName() + " " + "
"); if (s != null) s.close(); cClient.remove(this); ta.append(" : " + cClient.size() + "

"); } catch (Exception e) { e.printStackTrace(); } } public void run() { try { DataInputStream dis = new DataInputStream(s.getInputStream()); String str = dis.readUTF(); String st = s.getInetAddress().getHostName(); while (str != null && str.length() != 0) { for (Iterator it = cClient.iterator(); it.hasNext();) { ClientConn cc = (ClientConn) it.next(); if (this != cc) { cc.send(str, st); } } ta1.append(st + " :
" + str + "
"); str = dis.readUTF(); } this.dispose(); } catch (Exception e) { this.dispose(); } } } public static void main(String[] args) throws Exception { JFrame.setDefaultLookAndFeelDecorated(true); ChatServer cs = new ChatServer(8888); cs.startServer(); } }

 
클 라 이언 트 코드
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

import javax.swing.JButton;

public class ChatClient extends JFrame {
	JTextArea ta = new JTextArea("            !" + "
" + " ALT+ENTER
"); TextArea tf = new TextArea(3, 21); JButton btn = new JButton(" "); JPanel jp = new JPanel(); Socket s = null; public ChatClient() throws Exception { this.setLayout(new BorderLayout(10, 10)); this.add(ta, BorderLayout.CENTER); jp.add(btn, BorderLayout.SOUTH); this.add(tf, BorderLayout.SOUTH); this.add(jp, BorderLayout.EAST); btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { try { String sSend = tf.getText(); if (sSend.trim().length() == 0) return; ChatClient.this.send(sSend); tf.setText(""); ta.append(" :" + "
"); ta.append(sSend + "
"); } catch (Exception e) { e.printStackTrace(); } } }); btn.setMnemonic(KeyEvent.VK_ENTER); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setBounds(300, 300, 400, 500); setVisible(true); tf.requestFocus(); try { s = new Socket("10.20.10.201", 8888); } catch (Exception e) { ta.append(" ! " + "
"); } (new Thread(new ReceiveThread())).start(); } public void send(String str) throws Exception { DataOutputStream dos = new DataOutputStream(s.getOutputStream()); dos.writeUTF(str); } public void disconnect() throws Exception { s.close(); } public static void main(String[] args) throws Exception { JFrame.setDefaultLookAndFeelDecorated(true); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); ChatClient cc = new ChatClient(); String str = br.readLine(); while (str != null && str.length() != 0) { cc.send(str); str = br.readLine(); } cc.disconnect(); } class ReceiveThread implements Runnable { public void run() { if (s == null) return; try { DataInputStream dis = new DataInputStream(s.getInputStream()); String str = dis.readUTF(); while (str != null && str.length() != 0) { ChatClient.this.ta.append(str + "
"); str = dis.readUTF(); } } catch (Exception e) { e.printStackTrace(); } } } }

좋은 웹페이지 즐겨찾기