欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单的TCP/java聊天室

程序员文章站 2024-03-22 17:59:34
...

简单的TCP/java聊天室普通版和加强版

java聊天室普通版(TCP)

大家好,我是一名在校大大一学生,关于这个TCP网络编程,我是一个星期前刚刚进入学习java网络编程,刚开始的时候,各种看视频,查资料,上论坛,但是对于某些地方还是一知半解,我这个东西可能对于像我这样的小伙伴有些帮助,另一方面是想加深记忆。
话不多说,我也不会大佬们一样会一些底层原理,靠自己理解写的,大佬们轻点喷。。。
话不多说,先介绍我这个普通版。

因为是Java聊天室普通版,先大家理解一下运作过程,缺点在于需要双方互相发消息后才能接受到消息,因为接收(输入)程序在发送(输出)程序之后
刚刚来的时候,我一直被输入是发送还是接收弄得都魔神了。
大家需要去看看IO的运转原理,在下表达不太好,就不献丑了。

package ccx;

import com.sun.security.ntlm.Server;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

//服务器
public class javaDemo01 implements Runnable{
    static ServerSocket serverSocket=null;
    static Socket socket=null;
    static int number=0;
    static Socket[] sockets=new Socket[20];
    public javaDemo01(){
        try {
            serverSocket=new ServerSocket(1101);
        }catch (IOException e){
            e.printStackTrace();
        }

    }
    public static void main(String[] args) throws IOException {
        javaDemo01 javaDemo01=new javaDemo01();

        System.out.println("服务器已开启\n");
        while(true){
            try{
                socket=serverSocket.accept();
                number++;
                sockets[number]=socket;
                System.out.println("第"+number+"个用户连接");

            }catch(IOException e){
                e.printStackTrace();
            }
            Thread t1=new Thread(javaDemo01);
            t1.start();
        }
    }

    @Override
    public void run() {
        try {
            while (true) {

                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));//键盘输入的内容放入br
                DataOutputStream dos=new DataOutputStream(socket.getOutputStream());//socket获取dos输出的字节流(发送)
                DataInputStream dis=new DataInputStream(socket.getInputStream());//socket获取dis输入的字节流(接收)
                String str=br.readLine();//把br类型转换成String类型
                dos.writeUTF(str);//把str写入dos
                //获取消息
                System.out.println(dis.readUTF());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


package ccx;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class javaDemo02 implements Runnable{
    static Socket socket=null;
    public javaDemo02() throws IOException {
        socket=new Socket("localhost",1101);
        InetAddress s=socket.getInetAddress();
        System.out.println(s+"连接到服务器\n");

    }

    public static void main(String[] args) throws IOException {
        javaDemo02 javaDemo02=new javaDemo02();
        Thread t1=new Thread(javaDemo02);
        t1.start();
    }
    @Override
    public void run() {
        try {
            while(true) {
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
                DataInputStream dis=new DataInputStream(socket.getInputStream());
                String str=br.readLine();
                dos.writeUTF(str);

                System.out.println(dis.readUTF());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务端与客户端的区别其实不多,socket=new Socket(“localhost”,1101); 也就是连接到 socket=serversocket.accept(); 说来就是一个套娃
这里为了没有关闭流,大家不要养成我这个坏毛病,以后容易报错。
上加强版!加强版也就是解决了需要双方互发消息才能接收消息的毛病,答案就是在加线程!

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

//服务器
public class server implements Runnable{

    static ServerSocket serverSocket=null;
    static Socket socket=null;
    static BufferedReader br=null;


    public static void main(String[] args) throws IOException {
        serverSocket=new ServerSocket(1101);
        socket=serverSocket.accept();
        server server=new server();
        Thread t1=new Thread(server);
        t1.start();
        System.out.println("服务器已开启");
        while(true){
            receive receive=new receive(socket);
        }


    }

    @Override
    public void run() {
        while(true){
            try {
                br=new BufferedReader(new InputStreamReader(System.in));
                send send=new send(socket,br);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

//客户端
public class client implements Runnable{
    static Socket socket=null;
    static BufferedReader br;


    public static void main(String[] args) throws IOException {
        socket=new Socket("localhost",1101);
        client client=new client();
        Thread t1=new Thread(client);
        t1.start();
        System.out.println("client going to start!");
        while(true){
            receive receive=new receive(socket);
        }
    }

    @Override
    public void run() {
        while(true){
            try {
                br=new BufferedReader(new InputStreamReader(System.in));
                send send=new send(socket,br);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

package TCP;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

//发送线程
public class send{
    DataOutputStream dos=null;

    public send(Socket socket,BufferedReader br) throws IOException {
        DataOutputStream dos=new DataOutputStream(socket.getOutputStream());
        String str=br.readLine();
        dos.writeUTF(str);
    }

}

package TCP;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

//接收线程
public class receive {
    DataInputStream dis=null;
    public receive(Socket socket) throws IOException {
        DataInputStream dis=new DataInputStream(socket.getInputStream());
        System.out.println(dis.readUTF());
    }
}

最重要的还是需要自己去敲代码,你才能发现自己隐藏的问题。