关于C#和JAVA之间通过Socket实现局域网传递数据

为了做到在局域网内使用手机控制电脑上的C#窗体软件,我使用了Socket,在C#端(服务器)和JAVA端(客户端)传递数据,为了方便以后使用,我把发送和接收都封装成了方法。

话不多少,直接上代码。

C#端(服务器):

        IPAddress ip; //ip地址
        IPEndPoint point;//带端口号的ip地址
        Socket socketWatch;//用于监听的socket
        Socket socketSend;//用于发送的socket
        /// <summary>
        /// 连接监听
        /// </summary>
        public void Listen()
        {
            //在服务器端创建一个负责监听IP地址和端口号的Socket
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            foreach (IPAddress _IPAddress in Dns.GetHostEntry(Dns.GetHostName()).AddressList)
            {
                if (_IPAddress.AddressFamily.ToString() == "InterNetwork")
                {
                    ip = _IPAddress;//获取本机IP地址
                    //Console.WriteLine(ip.ToString());
                }
            }
            //ip = IPAddress.Parse("192.168.1.110");//创建ip地址对象
            point = new IPEndPoint(ip, 8998);//创建包含端口号的ip地址对象
            socketWatch.Bind(point);//绑定包含端口的ip到监听socket
            socketWatch.Listen(10);//开始监听,最大监听10个设备
            while (true)
            {
                socketSend = socketWatch.Accept();//等待客户端的连接,并创建一个用于通讯的socket
                Console.WriteLine(socketSend.RemoteEndPoint + "设备已连接到本服务器");
                Thread listenThread = new Thread(new ParameterizedThreadStart(GetClientMessage));//创建负责监听的子线程
                listenThread.IsBackground = true;//设置该子线程为后台线程
                listenThread.Start(socketSend);//启动线程传入监听socket
            }

        }
        /// <summary>
        /// 获得客户端的消息
        /// </summary>
        /// <param name="obj">Socket对象(为子线程方法,参数只能为Object)</param>
        private void GetClientMessage(Object obj)
        {
            Socket socket = obj as Socket;//转换数据类型
            while (true)
            {
                Byte[] buffer = new Byte[2048];//接收信息的字节数组
                int count = socket.Receive(buffer);//判断客户端连接状态
                if (count == 0)
                {
                    Console.WriteLine(socket.RemoteEndPoint + "断开连接");
                    break;//客户端断开时跳出
                }
                else
                {
                    String str = Encoding.UTF8.GetString(buffer, 0, count);//获得客户端发送的信息
                    Console.WriteLine(socket.RemoteEndPoint + "发送消息:" + str);
                }
            }
        }
        /// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="returnData">要发送的数据</param>
        /// <param name="returnSocket">发送数据使用的Socket</param>
        private void ReturnData(Byte[] returnData,Socket returnSocket)
        {
            returnSocket.Send(returnData, returnData.Length, SocketFlags.None);//发送
        }

JAVA端(客户端):

    Socket socket;// socket对象
    BufferedReader inputStream;//输入流
    PrintWriter prints;//输出流
    Boolean isDone = false;//连接状态

    /**
     * 连接
     * @param ip    ip地址
     * @param post    端口
     */
    public void GetConn(final String ip, final int post) {
        new Thread(new Runnable() {// 创建连接线程(安卓4.4以上版本,网络操作不能写在主线程中,非安卓可不写线程)
            public void run() {
                try {
                    socket = new Socket(ip, post);// 创建连接到服务器的socket
                } catch (Exception e) {
                    return;
                }
            }
        }).start();
    }
    /**
     * 接收消息
     */
    public void GetMessage() {
        try {
            inputStream = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));//绑定输出流到socket上
            new Thread(new Runnable() {
                @Override
                public void run() {
                    String str = null;//存放接收到的数据
                    while (isDone) {
                        try {
                            while ((str = inputStream.readLine()) != null) {
                                str = str.trim();
                                System.out.println("服务器:" + str);
                            }
                        } catch (IOException e) {
                            isDone = false;//断开连接
                            System.out.println("服务器无响应,与服务端断开连接...");
                        }
                    }
                }
            }).start();

        } catch (IOException e) {
            isDone = false;
            System.out.println("无法连接到服务器...");
        }
    }
    /**
     * 发送消息
     * @param message    要发送的信息
     */
    public void SendMessage(String message) {
        try {
            prints = new PrintWriter(socket.getOutputStream());//绑定输出流到socket
            new Thread(new Runnable() {
                @Override
                public void run() {
                    if (isDone) {
                        prints.print(message);//发送信息
                        prints.flush();//刷新缓存
                        Thread.sleep(1000);
                    }
                }
            }).start();

        } catch (IOException e) {
            isDone = false;
            System.out.println("无法连接到服务器...");
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值