网络开发之聊天小代码

(1)目的:对网络开发的知识进行一定的实践,增强对网络开发的了解
(2)技术:1、简单的套接字的运用
2、简单的静态方法和变量的使用
3、基本的方法,如构造方法,hasmap的使用
4、多线程
(3)代码
1、这是我们的客户端

package online;

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

public class client1 {
    public static void main(String [] args) throws IOException {
        //链接我们设置的服务端
        Socket socket = new Socket("10.129.0.123", 32917);
        //从终端输入我们的信息
        BufferedReader getline = new BufferedReader(new InputStreamReader(System.in));
        //创建一个字符串来接收我们的输入
        BufferedReader serint=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //接收从服务器回来的信息
        PrintStream output = new PrintStream(socket.getOutputStream());
        String mline;
        while(true) {
            String line = getline.readLine();
            mline=ruler.login + line + ruler.login;
            output.println(mline);
            String buget=serint.readLine();
            System.out.println(buget);
            if(buget.length()==4){
                System.out.println("登录成功!请记住你的昵称:"+line);break;
            }
            else {
                System.out.println("登入失败,此昵称已被他人使用");
                continue;
            }
        }//默认进去后首先选择的是输入名称
        player playtemp=new player(socket);//一个子线程,不断打印从服务器端打印出来的数据
        playtemp.start();//使这个线程进入就绪状态
        while((mline=getline.readLine())!=null){
            //output.println(ruler.person+mline+ruler.person);
            output.println(mline);
        }


    }
}
class client2{
    public static void main(String [] args) throws IOException {
        //链接我们设置的服务端
        Socket socket = new Socket("10.129.0.123", 32917);
        //从终端输入我们的信息
        BufferedReader getline = new BufferedReader(new InputStreamReader(System.in));
        //创建一个字符串来接收我们的输入
        BufferedReader serint=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //接收从服务器回来的信息
        PrintStream output = new PrintStream(socket.getOutputStream());
        String mline;
        while(true) {
            String line = getline.readLine();
            mline=ruler.login + line + ruler.login;
            output.println(mline);
            String buget=serint.readLine();
            System.out.println(buget);
            if(buget.length()==4){
                System.out.println("登录成功!请记住你的昵称:"+line);break;
            }
            else {
                System.out.println("登入失败,此昵称已被他人使用");
                continue;
            }
        }//默认进去后首先选择的是输入名称
        player playtemp=new player(socket);//一个子线程,不断打印从服务器端打印出来的数据
        playtemp.start();//使这个线程进入就绪状态
        while((mline=getline.readLine())!=null){
            output.println(mline);
        }

    }
}

2、我们的服务端,这里采用了多线程的使用

package online;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class serviver {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(32917);//设置这个类的端口
        //这里使用了对象方法的形式
        while (true) {//接收多个客户端
            Socket persocket = server.accept();//不停的接收客户端的输入
            playermannager player = new playermannager(persocket);
            player.start();
        }
    }
}

3、客户端子线程

package online;

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

public class player extends Thread {
    Socket socket;
    public player(Socket socket){
        this.socket=socket;
    }
    @Override
    public void run() {
        try {
            BufferedReader mget=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String mline;
            while((mline=mget.readLine())!=null){
                System.out.println(mline);
            }

        } catch (IOException e) {
        }
    }
}

4、服务端子线程

package online;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.HashMap;

public class playermannager extends Thread{
    public static HashMap<String,Socket> box=new HashMap<>();
    //设置一个静态键值对管理我们的客户端口和套接字
   Socket socket;
   public playermannager(Socket socket){
       this.socket=socket;
   }
    @Override
    public void run() {
        BufferedReader mread;
        PrintStream moutput;
        try{
            mread=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            moutput=new PrintStream(socket.getOutputStream());
            System.out.println("链接成功");
            String mgetline;//创建一个字符串接收子类的信息
            while((mgetline = mread.readLine())!=null) {
                System.out.println(mgetline);
                if (mgetline.startsWith(ruler.login) && mgetline.endsWith(ruler.login)) {
                    String name = mgetline.substring(2, (mgetline.length() - 2));//条件语句,客户是否选择了登录
                        if (chooselogin(name)) {//引用了这个方法
                            playermannager.box.put(name, socket);//将这个套接字和名称一起放入我们之前准备的那个变量
                            System.out.println(playermannager.box.entrySet());
                            moutput.println("true");//传输给相应的子类
                        } else {
                            moutput.println("false");
                            continue;
                        }
                    }

                //创建一个私聊代码块
                if (mgetline.startsWith(ruler.person) && mgetline.endsWith(ruler.person)) {
                    //创建一个字符串接受这些信息
                    int len = mgetline.length() - 2;//一个整型记录其字符串的长度-2
                    String mgetline2 = mgetline.substring(2, len);//去调我们的前缀和后缀
                    String[] str = mgetline2.split(ruler.mytry);//按照我们规定的规则分割这个字符串
                    String mnametemp = str[0];//分割会形成两个数组
                    System.out.println(str[0]);
                    String connet = str[1];
                    Socket hesocket = playermannager.namesocket(mnametemp);//得到我们私聊对象的套接字
                    String myname=playermannager.socketname(socket);
                    PrintStream heout = new PrintStream(hesocket.getOutputStream());//输出
                    heout.println(myname + "对你说:" + connet);
                }
                if(mgetline.startsWith(ruler.persons) && mgetline.endsWith(ruler.persons)){
                    //还是创建一个字符串接受这些信息
                    String nametemp1=playermannager.socketname(socket);
                    for(String nametemp2:box.keySet()){
                        Socket sockettemp=box.get(nametemp2);
                        PrintStream outtemp=new PrintStream(sockettemp.getOutputStream());
                        outtemp.println(nametemp1+"群发说:"+mgetline);
                    }
                }
            }

        }catch (IOException e){

        }
    }

    public boolean chooselogin(String name){//一个对象方法,检查是否有重名现象
        for(String key:box.keySet()){
            if(key.equals(name)){
                return false;
            }
        }
        return true;
    }
    public static Socket namesocket(String name){//创建一个方法同过名字找到套接字
       return box.get(name);
    }
    public static String socketname(Socket socket){//创建一个方法同过套接字找到名字
        for(String key:box.keySet()){
            if(box.get(key)==socket)return key;
        }
        return null;
    }
}

5、一些常量,我放在一个类里了,果然,这里用线程要代码要好看点

package online;

public class ruler {
    public static final String login="a+";
    public static final String person="b+";
    public static final String persons="c+";
    public static final String mytry="&&";
}

感悟:网络开发的学习也有几天了,感觉这个阶段的代码学习就很神奇,有些错误错误总是在你觉得不可能出错时出现,留下我一脸的懵逼和被迫百度短则一两分钟多达一个多小时的无奈,关键是,还不一定搞的定。总的来说,这个阶段进度可以感觉到不是很快,不用很费力就能跟上。可是知识的学习,嗯,,,要多敲代码去检验呀,要多敲代码去检验呀,要多敲代码去检验呀!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容