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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 展展 中级黑马   /  2014-3-17 18:46  /  1145 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


        思路:
        1,利用Tcp实现聊天,必须有客户端和服务端。因为要写在同段代码上,所以使用多线程。
        2,注意,使用多线程必须先将服务端运行起来,再运行客户端。否则出现异常。
        3,客户端:建立端点,并初始化。读取流读取键盘录入,通过Socket方法getOutputStream将数据写入流中。
        4,数据写入流中后,创建读取流,等待服务端收到数据后,所发送的数据,并打印在屏幕。
        5,服务端:建立端点,并初始化。字节读取流等待数据,当流中有数据时,读取,并打印在屏幕。
        5,当读取完成之后,将信息发送到客户端。通过getOutputStream。



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

class TcpOnline
{
        public static void main(String[] args)
        {
                try
                {
                        ServerSocket rec=new ServerSocket(10003);//创建服务端端点。
                        Rece rece=new Rece(rec);//建立服务端。
                        new Thread(rece).start();//服务端跑起!
                       
                        Thread.sleep(2000);//等待服务端稳定。
                        System.out.println("Server Open new !");

                        Socket cli=new Socket("127.0.0.1",10003);//创建客户端端点。
                        Client client=new Client(cli);//建立客户端。
                        new Thread(client).start();//客户端跑起!
                       


                }
                catch (Exception ex)
                {
                        throw new RuntimeException("NONO");
                }

       
        }
}

class Client implements Runnable//Client
{
        private Socket s;
        Client(Socket s)
        {
                this.s=s;
        }

        public void run()
        {
                try
                {
                        //读取流读取键盘录入。
                        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
                        String line=null;
                        //获取Tcp写入流
                        OutputStream out=s.getOutputStream();
                        //读取键盘录入,将数据写到流中。
                        while ((line=bufr.readLine())!=null)//read方法为阻塞式方法。
                        {
                                byte[] info=line.getBytes();
                                out.write(info,0,info.length);//写入流中。
                                out.flush();//刷新缓冲。

                        }

                        s.shutdownOutput();//数据发送完毕向服务端声明。
                        bufr.close();

                        InputStream in=s.getInputStream();
                        byte[] buf=new byte[1024];
                        int len=0;
                        while ((len=in.read(buf))!=-1)
                        {
                                String str=new String(buf,0,len);
                                System.out.println(str);
                        }



                }
                catch (Exception ex)
                {
                        throw new RuntimeException("Client Send lose");
                }
       
       
        }
}


class Rece implements Runnable//Rece
{
        private ServerSocket ss;
        Rece(ServerSocket ss)
        {
                this.ss=ss;       
        }

        public void run()
        {
                try
                {
                        Socket s=ss.accept();//获取客户端对象,并操作.
                        String ip=s.getInetAddress().getHostAddress();//通过客户端对象获取对方ip
                        InputStream in=s.getInputStream();
                        byte[] buf=new byte[1024];
                        int len=0;
                        //读取流中数据.
                        while ((len=in.read(buf))!=-1)//read为阻塞式方法。
                        {
                                String str=new String(buf,0,len);
                                System.out.println(ip+"::"+str);//打印客户端数据.
                        }

                        OutputStream out=s.getOutputStream();
                        out.write("send ok !".getBytes());//结束信息,发送给客户端。
                        out.flush();
                        Thread.sleep(500);//保证最后一条数据有时间发送到客户端。

                }
                catch (Exception ex)
                {
                        throw new RuntimeException("Rece lose");
                }
       
        }
}

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马