A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Kelvinhu 中级黑马   /  2014-4-9 21:56  /  1302 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码有欠缺的地方请各位多多指教:),进入正题啦~

首先来进行服务端的编写,服务端几个小步骤:

//1、创建socket

ServerSocket server = new ServerSocket();
Socket socket = server.accept();        //监听作用,该方法为阻塞式

//2、创建流
DataInputStream ds = new DataInputStream(socket.getInputStream());

//3、进行数据的读写
String message = ds.readUTF();
System.out.println(message);

然后编写客户端,与服务器端大致相同,少了监听的方法。

//1、创建socket
Socket s = new Socket("127.0.0.1",6665);.

//2、创建流
DataOutputStream dos = new DataOutputStream(s.getOutputStream());

//3、进行数据的读写
Scanner scanner = new Scanner(System.in);
String string=scanner.next();
dos.writeUTF(string);
dos.flush();

//4、用完了关闭
dos.close();
s.close();

以上就是大体的流程,然而我们需要多个人同时进入聊天室,则需要改成多线程的,代码如下
服务端:
import java.io.*;
import java.net.*;


public class Chat {
        public static void main(String[] args) {
                ServerSocket server = null;
               
                try {
                        server = new ServerSocket(6665);
                } catch (IOException e) {
                        System.out.println("端口被占用,创建端口失败。");
                }
                Socket socket = null;
                while (true){
                        try {
                                socket = server.accept();
                        } catch (IOException e) {
                                System.out.println("客户端连接失败。");
                        }
                        new Thread(new Rev(socket)).start();
                }
        }
}

class Rev implements Runnable{
        Socket socket = null;
       
        Rev(Socket socket){
                this.socket = socket;
        }
       
        public void run(){
                String ip=socket.getInetAddress().toString();
                try {
                        while(true){
                        DataInputStream ds = new DataInputStream(socket.getInputStream());
                        String message = ds.readUTF();
                        System.out.println(ip+":   "+message);
                        }
                } catch (IOException e) {
                        System.out.println("客户端"+ip+"已退出!");
                }
        }       
}

客户端:

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

class Client{
        public static void main(String args[]) throws Exception{
                Socket s = new Socket("127.0.0.1",6665);
               
                OutputStream os = s.getOutputStream();
                DataOutputStream dos = new DataOutputStream(os);
                while(true){
                        Scanner scanner = new Scanner(System.in);
                        String string=scanner.next();
                        if (string.equals("exit")){
                                System.out.println("退出了~");
                                s.shutdownInput();
                                dos.close();
                                s.close();
                                System.exit(0);
                        }
                        dos.writeUTF(string);
                        dos.flush();
                }
        }
}

评分

参与人数 1黑马币 +2 收起 理由
枫儿 + 2 赞一个!

查看全部评分

1 个回复

倒序浏览
你好.代码写得很好.
我给你一些建议.你试一下修改,会更优秀.

但是因为在控制台下面做以下的动作有点坑.看着两条线程在抢控制台的控制权 - -
所以最好用Swing

建议:
      既然是聊天室.一起聊天的人员至少两个吧.但是我看你代码.服务端处于不断监听的状态,那就是随时等待其他用户连接.但是忽略了一点.就是客户端发过来的消息最好由服务端转发给其他用户,所以最好用多线程.然后到了客户端.客户端和服务端建立连接后.必须要有即时性.所以用多线程.一条监听服务端发来的数据.这时你会问,服务端发什么数据给我?聊天室嘛.必须发其他用户发的消息给你.另外一条负责接收你的输入发送到服务端.

如果你按以上的建议去做.你会发现你能学到的东西很多.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马