JavaSE小练习(简单的聊天器)

为了巩固JavaSE的知识,练习一哈,大神绕道。下面贴一下代码。

Client端代码

package GUI;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
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.EOFException;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;

import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class ChatClient extends JFrame {

    /**
     *
     */
    private static final long serialVersionUID = 1L;

    JTextField tfTxt = new JTextField();

    JTextArea taContent = new JTextArea();

    Socket s = null;

    DataOutputStream dos = null;

    DataInputStream dis = null;

    Thread TRecv = new Thread(new RecvThread());

    private boolean bConnected = true;

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ChatClient().lauchFrame();
    }

    public void lauchFrame(){
        //主窗口设置
        this.setTitle("弱智交流平台?");
        this.setSize(500, 500);
        this.setLocationRelativeTo(null);
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent arg0){
                disconnect();
                System.exit(0);
            }
        });
        //设置布局
        this.setLayout(new BorderLayout());
        this.add(taContent, BorderLayout.NORTH);
        this.add(tfTxt, BorderLayout.SOUTH);
        //设置组件大小
        tfTxt.setPreferredSize(new Dimension(500, 50));
        taContent.setPreferredSize(new Dimension(500, 400));
        //文本域内容自动换行
        taContent.setLineWrap(true);
        //字体设置
        Font font1 = new Font("宋体",Font.BOLD,24);
        taContent.setFont(font1);
        Font font2 = new Font("宋体",Font.BOLD,18);
        tfTxt.setFont(font2);
        //将文本框的内容写入文本域的事件
        tfTxt.addActionListener(new TFListener());

        this.setVisible(true);

        //连接服务端
        connect();
        //启动线程接受信息
        TRecv.start();
    }

    private class TFListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
            //将文本框内容写入文本域
            String str = tfTxt.getText().trim();
            tfTxt.setText("");

            //将文本框内容写入服务端
            try{
                dos.writeUTF(str);
                dos.flush();
            }catch(IOException e3){
                e3.printStackTrace();
            }
        }

    }

    public void connect(){
        try{
            s = new Socket("127.0.0.1", 7777);
            dos = new DataOutputStream(s.getOutputStream());
            dis = new DataInputStream(s.getInputStream());
            System.out.println("已经连上服务端!");
        }catch(UnknownHostException e1){
            e1.printStackTrace();
        }catch(IOException e2){
            e2.printStackTrace();
        }

    }

    public void disconnect(){
        try{
            dos.close();
            dis.close();
            s.close();
        }catch(IOException e){
            e.printStackTrace();
        }

    }

    private class RecvThread implements Runnable{

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(bConnected){
                String str;
                try {
                    str = dis.readUTF();
                    taContent.setText(taContent.getText()+str+"\n");
                }catch(SocketException e){
                    System.out.println("退出了!");
                    bConnected = false;
                }catch(EOFException e){
                    bConnected = false;
                    System.out.println("退出了!");
                }catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }

    }

}

Server端

package GUI;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

public class ChatServer {

    List<Client> clients = new ArrayList<Client>();

    ServerSocket ss = null;

    public static void main(String[] args) {

        new ChatServer().start();

    }

    public void start(){
        try{
            ss = new ServerSocket(7777);
        }catch(IOException e){
            e.printStackTrace();
        }
        try{
            //服务器不止连接一个客户端
            while(true){
                Socket s = ss.accept();
                System.out.println("连接一个客户端!");
                Client c = new Client(s);
                clients.add(c);
                new Thread(c).start();
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                ss.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private class Client implements Runnable{

        private Socket s;

        private DataInputStream dis;

        private DataOutputStream dos;

        public Client(Socket s){
            this.s = s;
            try{
                dis = new DataInputStream(s.getInputStream());
                dos = new DataOutputStream(s.getOutputStream());
            }catch(IOException e){
                e.printStackTrace();
            }
        }

        public void sent(String s){
            try {
                dos.writeUTF(s);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            Client c = null;
            try{
                while(true){
                    String str = dis.readUTF();
                    System.out.println(str);
                    for(int i=0; i<clients.size();i++){
                        c = clients.get(i);
                        c.sent(str);
                    }
                }
            }catch(SocketException e){
                if(c != null){
                    clients.remove(this);
                }
            }catch(EOFException e){
                System.out.println("客户端断开连接!");
            }catch(IOException e){
                e.printStackTrace();
            }finally{
                try{
                    if(dis != null){
                        dis.close();
                    }
                    if(dos != null){
                        dos.close();
                    }
                    if(s != null){
                        s.close();
                    }
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
    }
}

初学Java到现在,第一次把所学的一些知识,联系起来,虽然是个很小的程序,但是也是有收获的,希望自己继续努力!

原文地址:https://www.cnblogs.com/Vamps0911/p/10743812.html

时间: 2024-10-30 04:13:12

JavaSE小练习(简单的聊天器)的相关文章

Python简单全双工聊天器

服务器: 1 #!/usr/bin/python 2 #enconding:utf-8 3 import sys 4 import socket 5 import select 6 import time 7 8 HOST='' 9 PORT=21234 10 ADDR=(HOST,PORT) 11 BUFSIZ=8096 12 13 SerSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) 14 SerSock.setsockopt(so

python使用udp实现聊天器

聊天器简易版 使用udp实现一个简单的聊天器程序,要求如下: 在一个电脑中编写1个程序,有2个功能 1.获取键盘数据,并将其发送给对方 2.接收数据并显示 并且功能数据进行选择以上的2个功能调用 例子程序如下: import socket def send_message(udp_socket): # 输入对方的ip/port dest_ip = input("请输入对方的ip:") dest_port = int(input("请输入对象的port:")) # 读

大致了解写java聊天器所需要的技术

今天刚刚开通博客,希望它陪我一起成长. 未来的时间要完成java聊天器的小项目.今天先简单查阅了一下需要用到的技术内容. 1.对聊天数据的保存,需要用到数据库 2.实现消息的接收和发送,需要用到网络 3.保持网络连接,需要用到线程 4.聊天器还需要有界面 以上是粗略的技术内容,还要弄清楚客户端和服务器端分别的任务,聊天器实现的就是客户端和服务器端的交互.找到了一张示意图 如下 服务器端的主要功能: a)         在特定的端口上进行监听,等待客户端连接. b)        默认端口为30

Java网络编程以及简单的聊天程序

网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编程简要概述: 网络编程实质实质就是两个(或多个)设备(例如计算机)之间的数据传输.而要实现两台计算机通过互联网连接进行数据传输,必输要满足计算机网络的5层协议(物理层,数据链路层,网络层,运输层,应用层):当然有划分可能不同,但现在大家比较容易接受理解的是五层模型.而其中前三层物理层,数据链路层以及

Android 实现简单音乐播放器(一)

今天掐指一算,学习Android长达近两个月了,今天开始,对过去一段时间的学习收获以及遇到的疑难杂症做一些总结. 简单音乐播放器是我自己完成的第一个功能较为完整的APP,可以说是我的Android学习之路上的一个小小里程碑,给我增加了很多信心(~~真容易获得满足~~).从下面开始,我将详细介绍MusicPlayer的设计过程. 首先,先看一下这个项目的工程目录和运行效果:      从上面的图片看到,整个工程的布局文件有两个:activity_main.xml和musiclist.xml,其中,

C#编写简单的聊天程序(转)

这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考.文章大体分为四个部分:程序的分析与设计.C#网络编程基础(篇外篇).聊天程序的实现模式.程序实现. 程序的分析与设计 1.明确程序功能 如果大家现在已经参加了工作,你的经理或者老板告诉你,“小王,我需要你开发一个聊天程序”.那么接下来该怎么做呢?你是不是在脑子里有个雏形,然后就直接打开VS2005开始设计窗体,编写代码了呢?在开始之前,我们首先需要

Java网络编程 - 基于UDP协议 实现简单的聊天室程序

最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. 先看一下效果: 实现的效果可以说是非常非常简单,但还是可以简单的看到一个实现原理. "聊天室001"的用户,小红和小绿相互聊了两句,"聊天室002"的小黑无人理会,在一旁寂寞着. 看一下代码实现: 1.首先是消息服务器的实现,功能很简单: 将客户端的信息(进入了哪一个聊

php小项目-web在线文件管理器

php小项目-web在线文件管理器 一 项目结果相关视图 二 项目经验 通过简单的实现小项目,对php的文件相关操作更加熟悉,主要用于熟悉文件的相关操作 三 源代码下载地址 http://files.cnblogs.com/files/qiujun/fileManager.zip

简单的聊天室制作

简单的聊天室制作 一个简单的聊天室,主要是就两个部分,一部分就是我们进行的时候那个聊天窗口,另外一个就是背后的服务器,我们要写一个聊天窗口,也要写一个相对应的服务器. 做一个项目过程中,写一个代码很简单,但是把逻辑分析清楚,将制作的过程中所有的逻辑关系分析清楚是项目的最重要的环节. 下面的一步一步,将这个聊天室的制作过程一步一步制作出来. 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步: 第九步: 第十步: 第十一步: 这就是简单的聊天室的制作的过程.这样我们来看一