• Java socket2


    通过socket对象可以获取通信对方的socket信息

    客户端:

    import java.net.*;
    import java.io.*;
    
    public class TestServer {
        public static void main(String[] args) {
            try {
                ServerSocket s = new ServerSocket(8888);
                while(true) {
                    Socket s1 = s.accept();
                    OutputStream os = s1.getOutputStream();
                    DataOutputStream dos = new DataOutputStream(os);
                    dos.writeUTF("Hello"+s1.getInetAddress()+"#port"+s1.getPort()+"bye bye");
                    dos.close();
                    s1.close();
                }
            } catch(IOException e) {
                System.out.println("程序运行出错:"+e);
            }
        }
    }

    用户端:

    import java.net.*;
    import java.io.*;
    
    public class TestClient {
        public static void main(String[] args) {
            try {
                Socket s1 = new Socket("192.168.56.1",8888);
                InputStream is = s1.getInputStream();
                DataInputStream dis = new DataInputStream(is);
                System.out.println(dis.readUTF());
                dis.close();
                s1.close();
            } catch(ConnectException connExc) {
                connExc.printStackTrace();
                System.out.println("服务器连接失败!");
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    结果:    Hello/192.168.56.1#port56660bye bye

    s1.getInetAddress()    这个是拿到ip地址的意思,注意这里拿的是客户端的ip地址。因为这个s1拿的是对面client的ip

    s1.getPort()        拿的是客户端的端口号  (注意,拿到的端口号可不是8888,8888是服务器的端口号,拿到的端口号56660是本身这个客户端连上去显示的端口号,是随机选的。)

    然后我们试一个互相两边都能通话的例子:

    server:

    import java.net.*;
    import java.io.*;
    
    public class TestSocketServer {
        public static void main(String[] args) {
            InputStream in = null;
            OutputStream out = null;
            try {
                ServerSocket ss = new ServerSocket(5888);
                Socket socket = ss.accept();
                in = socket.getInputStream();
                out = socket.getOutputStream();
                DataOutputStream dos = new DataOutputStream(out);
                DataInputStream dis = new DataInputStream(in);
                String s = null ;
                if((s = dis.readUTF())!=null) {
                    System.out.println(s);
                    System.out.println("from"+socket.getInetAddress());
                    System.out.println("port"+socket.getPort());
                }
            dos.writeUTF("hi,fuck you ");
            dis.close();
            dos.close();
            socket.close();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    client:

    import java.net.*;
    import java.io.*;
    
    public class TestSocketClient {
        public static void main(String[] args) {
            InputStream is = null;
            OutputStream os = null;
            try {
                Socket socket = new Socket("localhost",5888);
                is = socket.getInputStream();
                os = socket.getOutputStream();
                DataInputStream dis = new DataInputStream(is);
                DataOutputStream dos = new DataOutputStream(os);
                dos.writeUTF("ok!yes you are right!");
                String s = null;
                if((s = dis.readUTF())!=null) {
                    System.out.println(s);
                }
                dos.close();
                dis.close();
                socket.close();
            } catch(UnknownHostException e) {
                e.printStackTrace();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }

    必须是一个先读,一个先写。要是两个都先写,就会两个都卡在那。因为这个readUTF()是堵塞式的。不然就会死死地卡在那。

  • 相关阅读:
    .NET自带控件 ································
    FCKeditor 2.2 + Asp.Net 设置
    . Net 2.0 实现动态切换首页图片···················
    按月统计的问题,即数据中没有该月的数据,该月的数据显示为0
    Active Directory如何用C#进行增加、删除、修改、查询用户与组织单位!
    GridView 的排序 !!
    利用GridView显示主细表并一次编辑明细表所有数据的例子 !!【转自孟子e章】
    [翻译]使用ASP.NET2.0的ReportViewer查看RDLC报表 !!!
    opengl 教程(20) 点光源
    每个程序员都应该了解的内存知识(1)
  • 原文地址:https://www.cnblogs.com/wangshen31/p/7445938.html
Copyright © 2020-2023  润新知