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

第一步:创建一个简单的服务器,能将客户机发来的字符串显示出来,并且再回送给客户机
Java中编写网络通信程序,就必须用到java.net包下面的API;创建一个服务器,那是相当的 简单。 第一步:在指定端口上创建一个java.net.ServerSocket对象

ServerSocket server=new ServerSocket(9090);
System.out.println("服务器创建成功!"+port);

第二步:当服务器创建成功后,就像的的手机开机后,进入待机状态一样,你也要让服务器进入 等待状态,当然是等待其它的客户机来连结它:

Socket client = server.accept();

第三步:通过client对象得到输入/输出流

OutputStream  out=client.getOutputStream();//得到一个输出/输入流对象
InputStream ins =client.getInputStream();

第四步:根据输入流对象读取数据,向输出流对象写入数据,读到的,即是客户机发来的,写出的即是发给客户机的。

如何使用命令提示符连结创建的服务器:
物理上,一台计算机,可以逻辑中的分成客户机和服务器两部分: 现在你手前的计算机就是一台服务器,当你进入命令行,执行telnet命令后,它同时又是一台客 户机;这样,本地的ip地址可以用”localhost”这个词代码,当然不包括双引号:


问题:
1.服务器连结一个用户退出后不能连结下一个用户。
解决方法:让服务器循环等待。

while (true) {// 让服务器处循环等待状态
                        Socket client = server.accept();
                        ......
                }

2.服务器不能同时连结多个用户。
解决方法:多线程服务器

当一个用户连结进来,就生成一个线程对象处理client对象。

代码部分
两个类,一个创建服务器类,一个服务器的线程类
创建服务器类

/**
* 服务器端处理与客户机连结对象的线程类对象的线程类封装
*/
public class TestServer extends Thread {
       
       
        /**
         * 在制定端口上启动一个服务器
         *
         * @throws IOException
         * @throws 服务器所以的端口
         */
        public void setUpServer(int port) throws Exception {
                // 1.建立绑定在制定端口上的服务器对象
                ServerSocket server = new ServerSocket(port);
                System.out.println("创建服务器成功" + port);
                // 等待客户机连结进入,进入后,生成一个Socket对象
                while (true) {// 让服务器处循环等待状态
                        Socket client = server.accept();
                        ServerThread st = new ServerThread(client);
                        st.start();
                        System.out.println("我已经启动了一个线程去处理这个对象了");
                }
        }

       
        public static void main(String[] args) throws Exception {
                TestServer ts = new TestServer();
                ts.setUpServer(9090);

        }

}

服务器线程类

public class ServerThread extends Thread{
        private Socket client;//线程对象要处理的连结变量
        private OutputStream out;//输出流对象
        /**创建这个线程类对象时,传入一个它要处理的对象*/
        public ServerThread(Socket sc){
                this.client=sc;
        }
        //将发送消息的代码包装到一个方法中
        public void sendMsg2Me(String msg) throws Exception{
                byte[] data = msg.getBytes();
                out.write(data); //用输出对象发送!
                out.flush();//强制输出
        }
        public void run(){
                //在线程run中调用处理连结的方法
                try {
                        processChat(this.client);
                } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
               
        }
        /**
         * 处理连接对象;读取客户机发来的字符串,回送给客户机
         *
         * @param client:与客户机连结的对象
         * @throws IOException
         */
        //处理客户机的连结对象
        private void processChat(Socket client) throws Exception{
                out=client.getOutputStream();//得到一个输出/输入流对象
                InputStream ins =client.getInputStream();
                String s ="你好,欢迎来到服务器!\r\n";
                this.sendMsg2Me(s);
                String inputS=readString(ins);
                while(!inputS.equals("bye")){
                        s="我收到了你的话啦"+inputS+"\r\n";
                        this.sendMsg2Me(s);//将这个字符串发送给客户机对象
                        inputS=readString(ins);//再次读取
                }
                s="你好,欢迎再来!\r\n";
                this.sendMsg2Me(s);
                client.close();
               
        }
       
        /**
         * 从输入流对象中读取字节,拼成一个字符串反加
         * 如果读到一个字节值为13,则认为以前的是一个字符串
         * @param ins:输入流对象
         * @return:从流上(客户机发来的)读到的字符串
         * @throws Exception
         */
       
        private String readString(InputStream ins) throws Exception{
                StringBuffer stb = new StringBuffer();//创建一个字符缓冲区
                char c=0;
                while(c!=13){
                        //遇到一个换行,就是一句话
                        int i = ins.read();//读取客户机发来的一个字节
                        c=(char)i;//将输入的字节转换成一个Char
                        stb.append(c);
                }
                //将读到的字节组转为字符串
                String inputS=stb.toString().trim();
                return inputS;
               
        }
}
---------------------
【转载,仅作分享,侵删】
作者:lzq1326253299
原文:https://blog.csdn.net/lzq1326253299/article/details/82889485
版权声明:本文为博主原创文章,转载请附上博文链接!

2 个回复

倒序浏览
一个人一座城0.0 来自手机 中级黑马 2019-2-25 08:49:44
沙发
看一看。
回复 使用道具 举报
奈斯,感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马