捷凌网安JAVA频道
捷凌IT教育
首页 资讯动态 认证考试 新手入门 核心技术 高级技术 J2EE J2ME 开源技术 其他技术 论坛
 您现在的位置: 捷凌网安 >> Java >> 核心技术 >> 网络编程 >> 正文
Java Socket 编程——多线程网络聊天程序

作者:佚名 责任编辑:左决 点击数: 更新时间:2008-4-30 2:56:21

    用java进行网络编程确实很方便,很容易上手。这几天用java进行socket编程,收获不少。

    首先,进行服务端的编程,作为服务端,编程主要按下面几个步骤进行:

    // 1. 创建socket
    ServerSocket ss = new ServerSocket(PortNumber);
    Socket s = ss.accept(); //监听器,产生阻塞,直到有连接才停止阻塞。

    // 2. 打开输入流、输出流
    OutputStream os = s.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(os);
    InputStream is = s.getInputStream();

    // 3. 根据一定的协议读写数据
    // 服务器 --> 客户
    //os.wrITe("Hello,I am Server!".getBytes());
    bos.wrITe("Hello,I am Server!".getBytes());
    bos.flush(); //注意!!

    // 服务器 <-- 客户
    byte[] buf = new byte[100];
    int len = is.read(buf);
    System.out.println(new String(buf, 0, len));

    // 4. 关系流和Socket
    //os.close();
    bos.close();
    is.close();
    s.close();
    ss.close();

    作为客户端则分为下面几个步骤,其实和服务端差不多,只是少了用ServerSocket进行监听。

    // 1. 创建socket
    Socket s = new Socket(InetAddress.getByName("localhost"),
            PortNumber);
    // 2. 打开输入流、输出流
    OutputStream os = s.getOutputStream();
    InputStream is = s.getInputStream();

    // 3. 根据一定的协议读写数据
    // 服务器 --> 客户
    byte[] buf = new byte[100];
    int len = is.read(buf);
    System.out.println(new String(buf, 0, len));
    // 服务器 <-- 客户
    os.wrITe("Hello,I am Client!".getBytes());

    // 4. 关系流和Socket
    os.close();
    is.close();
    s.close();

    上面这些只是一个单线程的服务端->客户端的程序,只能进行一次通讯,多次通讯将被告知无法连接。

    这时,我们就需要用到进程Thread进行编程,将其改造成多线程聊天程序,可以同时进行多客户端的连接与发送信息。

    代码如下:

    //Server.java

    import java.awt.*;
    import java.net.*;
    import java.io.*;

    public class Server extends Thread {
        ServerSocket skt;

        Socket Client[]=new Socket[10];;
        Socket Client1=null;

        int i = 0;

        TextArea in;

        int port,k=0,l=0;

        //BufferedReader theInputStream;

        PrintStream theOutputStream;

        //String readin;

        Face chat;

        public Server(int port, Face chat) {
            try {
                this.port = port;
                skt = new ServerSocket(port);
                this.chat = chat;
            } catch (IOException e) {
                chat.ta.append(e.toString());
            }
        }

        public void run() {

            chat.ta.append("等待连线......");

            while (true) {
                //System.out.print(""+i+"\n");
                try {


                Client[k] = skt.accept(); /* 接收客户连接 */

                //当有客户端连接时就新建一个子线程


                if (i < 2) {
                    ServerThread server[] = new ServerThread[10];
                     server[k]= new ServerThread(Client[k], this.chat, i);
                     l=server.length;
                     server[k].start();
                    chat.ta.append("客户端" + Client[k].getInetAddress() + "已连线\n");
                    /*theInputStream = new BufferedReader(new InputStreamReader(Client
                            .getInputStream()));*/
                    //for(int j=0;j<server.length;j++)
                    theOutputStream = new PrintStream(server[k].getClient().getOutputStream());
                    i = server[k].getI();
                    k++;
                } else {
                    //theOutputStream = new PrintStream(null);
                }

            } catch (SocketException e) {
                //chat.ta.append("连线中断!\n");

                //chat.clientBtn.setEnabled(true);
                //chat.serverBtn.setEnabled(true);
                //chat.tfaddress.setEnabled(true);
                //chat.tfport.setEnabled(true);
                //try {

                        //skt.close();
                        //Client.close();
                    //} catch (IOException err) {
                    //    chat.ta.append(err.toString());
                    //}
                } catch (IOException e) {
                    chat.ta.append(e.toString());
                }
            }

        }

        public void dataout(String data) {
            //for(int j=0;j<l;j++)
            theOutputStream.println(data);
        }
    }

    class ServerThread extends Thread {
        ServerSocket skt;

        Socket Client;

        TextArea in;

        int port;

        int i;

        BufferedReader theInputStream;

        PrintStream theOutputStream;

        String readin;

        Face chat;

[1] [2] [3] 下一页

  • 上一篇文章:

  • 下一篇文章:
  •  
     最进更新
    普通文章J2SE实现windows读取网卡的物05-11
    普通文章Scala—Java的避难所之main(05-11
    普通文章Spring数据源的灵活配置巧应05-11
    普通文章Spring 与 Log4J 进行动态日05-11
    普通文章Heritrix的多线程ToeThread和05-11
    普通文章应用spring示例开发网站构思05-11
    普通文章Spring 数据源配置与应用05-11
    普通文章Spring中的四种声明式事务的05-11
    普通文章Hibernate+Spring搞定Clob、05-11
    普通文章Hibernate的映射关联关系05-11
     
     推荐文章
    推荐文章Java技术开源搜索引擎04-30
    推荐文章Eclipse中建立自己的JUnit测04-30
    推荐文章Eclipse 3.3上安装jadclipse04-30
    推荐文章spring 编程入门十大问题解答04-30
    推荐文章Java编程中Spring的一些负面04-30
    推荐文章Java应用中Hibernate对多表关04-30
    推荐文章关于hibernate的缓存和CRUD04-30
    推荐文章基于Struts1.2的动态多文件上04-30
    推荐文章演示Struts2实现简单上传代码04-30
    推荐文章J2EE学习笔记--Struts初步认04-30
     
     热点文章
    普通文章J2SE实现windows读取网卡的物05-11
    普通文章Scala—Java的避难所之main(05-11
    普通文章Spring数据源的灵活配置巧应05-11
    普通文章Spring 与 Log4J 进行动态日05-11
    普通文章Heritrix的多线程ToeThread和05-11
    普通文章应用spring示例开发网站构思05-11
    普通文章Spring 数据源配置与应用05-11
    普通文章Spring中的四种声明式事务的05-11
    普通文章Hibernate+Spring搞定Clob、05-11
    普通文章Hibernate的映射关联关系05-11

    | 设为首页 | 加入收藏 | 联系站长 | 广告服务 | 友情链接 | 版权申明 | 网站地图 |

    在线交流 捷凌网安主群:51649627
    Copyright 2007-2008 © 捷凌网安. All rights reserved.
    备案序号:蜀ICP备08001812号