java写的聊天程序
2011-04-08 20:09
316 查看
初学java,本文是修改的head first java 里的一段代码而成,花了将近两天的时间,第一次自己动手写java程序,有不妥之处,望各位指出。
分为客户端和服务端,能够识别自己和其它用户,服务端接收消息用的多线程。缺点还很多,如,不支持用户名、没有返回聊天时间、不能保存聊天记录等。。。由于时间有限,不能一下处理完这些问题。先把代码贴出来,欢迎拍砖!
分为客户端和服务端,能够识别自己和其它用户,服务端接收消息用的多线程。缺点还很多,如,不支持用户名、没有返回聊天时间、不能保存聊天记录等。。。由于时间有限,不能一下处理完这些问题。先把代码贴出来,欢迎拍砖!
]/** VerySimpleChatServer.java * Chat Server * The program just build a chat server * for chat clients online * the connect port is '5000' */ import java.io.*; import java.net.*; import java.util.*; public class VerySimpleChatServer { ArrayList<PrintWriter> clientOutputStreams; /** Name clienthander () * multi thread */ private class ClientHandler implements Runnable { BufferedReader reader; Socket sock; /** Name ClientHandler * public method * initialize buffereader and send message * to all client */ public ClientHandler(Socket clientSocket) { try { sock = clientSocket; InputStreamReader isReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(isReader); } catch(Exception ex) {ex.printStackTrace();} } synchronized public void run() { String message; try { Thread.sleep(500); // sleep to avoid server cannt reaction while ((message = reader.readLine()) != null) { System.out.println("read " + message); tellEveryone(message); } // close while() } catch (Exception ex) {ex.printStackTrace();} } } public static void main(String[] args) { new VerySimpleChatServer().go(); } public void go () { clientOutputStreams = new ArrayList<PrintWriter>(); try { ServerSocket serverSock = new ServerSocket(5000); System.out.println("Waite Client Connection..."); while(true) { Socket clientSocket = serverSock.accept(); PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); clientOutputStreams.add(writer); // Ready for another thread called tellEveryone() Thread t1 = new Thread(new ClientHandler(clientSocket)); Thread t2 = new Thread(new ClientHandler(clientSocket)); t1.start(); t2.start(); // System.out.println("got a connection: " ); } }catch (Exception ex) { ex.printStackTrace(); } } /** * This method can solve many problem * Broadcast message to all client */ public void tellEveryone(String message) { Iterator it = clientOutputStreams.iterator(); while(it.hasNext()) { try { PrintWriter writer = (PrintWriter) it.next(); writer.println(message); writer.flush(); } catch(Exception ex){ ex.printStackTrace(); } } // close while } // close tellEveryone } /** SimpleChatClient.java * ChatCilent * The program just build one connect * and keep to send message * The default server IP and port "192.168.1.101:5000" */ import java.io.*; import java.net.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class SimpleChatClient{ JTextArea incoming; JTextField outgoing; BufferedReader reader; PrintWriter writer; Socket sock; String nativeip; String severip = "192.168.1.101"; public static void main(String args[] ) { SimpleChatClient client = new SimpleChatClient(); client.go(); } public void go() { JFrame frame = new JFrame("Ludicrously Simple Chat Client "); JPanel mainPanel = new JPanel(); incoming = new JTextArea(20,40); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); incoming.setEditable(false); JScrollPane qScroller = new JScrollPane(incoming); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); outgoing.addActionListener(new KeyboardListener()); JButton sendButton = new JButton("Send"); JButton cleanText = new JButton("Clean Text"); sendButton.addActionListener(new SendButtonListener()); cleanText.addActionListener(new CleanButtonListener()); mainPanel.add(qScroller); mainPanel.add(outgoing); mainPanel.add(sendButton); mainPanel.add(cleanText); setUpNetworking(); // Get local IP Address nativeip = getlocalip(); Thread readerThread = new Thread(new IncomingReader()); readerThread.start(); frame.getContentPane().add(BorderLayout.CENTER, mainPanel); frame.setSize(600, 500); frame.setVisible(true); } //go private void setUpNetworking() { //Stand and Initializ a new Network connect try{ sock = new Socket(severip, 5000); InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(sock.getOutputStream()); } catch (IOException ex) { ex.printStackTrace(); } } /** Name :getlocalip() * return a String type which the * local host ip address * (ipv4) * */ private String getlocalip(){ String ipv4 = null; try { Enumeration<NetworkInterface> netIf = NetworkInterface.getNetworkInterfaces(); while (netIf.hasMoreElements()) { NetworkInterface nwi = netIf.nextElement(); Enumeration address = nwi.getInetAddresses(); while (address.hasMoreElements()) { InetAddress in = (InetAddress) address.nextElement(); if(in.isSiteLocalAddress()){ ipv4 = in.getHostAddress(); // System.out.println(ipv4); break; } } } } catch (SocketException e) { e.printStackTrace(); } return ipv4; } /** Name delay * delay some secends * **/ private void delay(int time){ try { Thread.currentThread().sleep(time * 1000); } catch(InterruptedException e) {e.printStackTrace();} } /** Name keyboardListener * inner class * reaction enter board **/ public class KeyboardListener implements ActionListener { public void actionPerformed(ActionEvent ev) { if(incoming.getLineCount() >= 25) { if(incoming.getLineCount() < 35){ incoming.append("Warning: The chat data will be clean/n"); } else { incoming.setText(""); incoming.append("Chat data was clean/n"); } } if(outgoing.getText().equals("")){ //outgoing.setText("please put some words!"); incoming.append("Warning: Please typing some words/n"); } else{ String sendmsg = getlocalip() + ":" + outgoing.getText(); try { writer.println(sendmsg); writer.flush(); } catch (Exception ex) { ex.printStackTrace(); } } outgoing.setText(""); outgoing.requestFocus(); } } // close keyboardListener /** Name CleanButtonListener * inner class * clear textarea **/ public class CleanButtonListener implements ActionListener { public void actionPerformed(ActionEvent ev) { incoming.setText(""); } } /** Name SendButtonListener * inner class * when click Send Button * the event will reaction * */ public class SendButtonListener implements ActionListener { public void actionPerformed(ActionEvent ev) { // when client send message, it must bring itself infomation // (like ipaddress or username ) to sever // use ":" split ipaddress if(incoming.getLineCount() >= 25) { if(incoming.getLineCount() < 35){ incoming.append("Warning: The chat data will be clean/n"); } else { incoming.setText(""); incoming.append("Chat data was clean/n"); } } if(outgoing.getText().equals("")){ //outgoing.setText("please put some words!"); incoming.append("Warning: Please typing some words/n"); } else{ String sendmsg = getlocalip() + ":" + outgoing.getText(); try { writer.println(sendmsg); writer.flush(); } catch (Exception ex) { ex.printStackTrace(); } } outgoing.setText(""); outgoing.requestFocus(); } } // close inner class /** Name IncomingReader * inner class * */ public class IncomingReader implements Runnable { public void run() { String message; String[] smeg; try { while ((message = reader.readLine()) != null) { smeg = message.split(":"); // recongnized ':' judge the host name if(smeg[0].equals(nativeip)) message = "Me["+ smeg[0] +"]: " + smeg[1]; else message = "Stranger["+ smeg[0] +"]: " + smeg[1]; //Keep the same format System.out.println("read " + message); incoming.append(message + "/n"); //read the message and append to the JTextArea control.. } // end while } catch (Exception ex) {ex.printStackTrace();} } } }
相关文章推荐
- java聊天程序(包含服务端和客户端)
- 微信 开发 聊天机器人设计方案 java语言 程序和数据库代码
- Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序
- Java通信——聊天程序
- Java实现多个客户端聊天程序
- JAVA中的Socket一对一聊天程序
- java聊天程序客户端和服务器端,BUG中。。。。。
- JavaAWT简单Socket多人聊天程序(简单明了)
- JAVA多服务器通讯框架-聊天功能演示程序 V0.1 alpha 发布并提供下载
- Java 网络 UDP 一个局域网下的聊天小程序
- java中UDP简单聊天程序
- 详解基于java的Socket聊天程序――客户端(附demo)
- java----------C/S编程-----简单聊天程序
- Java 基于socket thread 简单聊天程序
- 详解基于java的Socket聊天程序——客户端(附demo)
- JAVA 网络编程 UDP(聊天程序)
- java 聊天程序 socket网络编程
- Java 基于多客户端的ServerSocket—聊天服务器端,客户端Socket “操作文件”系统的程序拼接
- java聊天程序(二)
- Java使用TCP聊天程序