vwin.888com

java实现socket网络通信功能

         网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址。而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分。java中IP地址使用InetAddress类来表示,获取InetAddress实例的两个方法为:一个为getByName(String host),根据主机获取对应的InetAddress对象,另一个为getByAddress(byte[] addr),根据IP地址获取InetAddress对象。InetAddress提供了三个方法来获取InetAddress实例对应的IP地址和主机名:(1)String getCanonicalHostName()获取此IP地址的权限定域名;(2)String getHostAddress()获取InetAddress实例对应的IP地址;(3)String getHostName()获取此IP地址的主机名。此外InetAddress类使用getLocalHost()方法获取本机IP地址对应的InetAddress实例,使用isReachable()方法测试是否可以到达该地址。服务器端使用ServerSocket创建TCP服务器,使用accept()进行监听,如果接收到客户端请求则返回一个与客户端对应的Socket,否则处于等待状态。客户端根据服务器的IP,连接服务器。服务器代码:
import java.net.*;
import java.io.*;
/**
手机端代码
手机端作为服务器,获取自己的ip地址,并显示以供客户端连接
*/
public class phone_Server
{
    public static void main(String[] args)
        throws IOException
    {
        //打印本机的IP地址
        InetAddress address=InetAddress.getLocalHost();
        System.out.println("本机的IP地址是"+address.getHostAddress());
        // 创建一个ServerSocket,用于监听客户端Socket的连接请求
        ServerSocket ss = new ServerSocket(30000);
        // 采用循环不断接受来自客户端的请求
                                while (true)
        {
            // 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
            Socket s = ss.accept();
            // 将Socket对应的输出流包装成PrintStream
            PrintStream ps = new PrintStream(s.getOutputStream());
            // 进行普通IO操作
            ps.println("您好,您收到了服务器的新年祝福!");
            // 关闭输出流,关闭Socket
            ps.close();
            s.close();
        }
    }
}
         客户端代码:
/**
PC端代码
PC作为客户端,根据服务器的IP地址和端口号连接服务器
*/
import java.net.*;
import java.io.*;
public class PC_Client
{
    public static void main(String[] args)
        throws IOException
    {
        //Socket socket = new Socket("127.0.0.1" , 30000);
        Socket socket = new Socket("192.168.47.1" , 30000);//这里的IP地址填写手机端服务器的IP地址
        // 将Socket对应的输入流包装成BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        // 进行普通IO操作
        String line = br.readLine();
        System.out.println("来自服务器的数据:" + line);
        // 关闭输入流、socket
        br.close();
        socket.close();
    }
}
         补充一点socket传输大数据的内容,由于socket单次传输的数量是有一定的限制的,所以应该分批次传输和接受,对于传输可以写成这样:
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                int start=0;
                while((start+1024)<data.length)
                {
                    out.write(data, start,1024);
                    start=start+1024;
                }
                if(start<data.length)
                {
                    out.write(data, start,(data.length-start+1));
                }
                //String str = new String(data);
                //out.writeUTF(str);
            }catch (Exception e) {
                Log.d(TAG, "文件传输异常");
            }
         接收代码如下:
        DataInputStream input = new DataInputStream(socket.getInputStream());
        byte []buf=new byte[1024];
        int readnum=0;
        while(true)
        {
            readnum=input.read(buf); 
            if(readnum>0)
            {
                System.out.println(Arrays.toString(buf));
                while((readnum=input.read(buf))>0)
                {
                    System.out.println(Arrays.toString(buf));
                }
            }
        }

联系电话:13572265258、13324575128
QQ:455075912

服务宗旨

        我们为政府及企事业单位提供从管理咨询、软件定制开发、软件实施以及运营维护的全程、优势、一体化业务生态链服务体系。以业务流程梳理、优化和数据标准化为目标的管理咨询,协助企业提升管理基础。基于SCP智慧云平台的构件组装思想,以创新的“BTO+DIY”模式为客户提供可视化、快速的软件定制开发。我们为企业提供长期的软件系统运营和维护服务,持续地进行软件系统的维护、升级和完善,为客户创造长期的价值和潜在的增长(BTO:客户提需求,软件“按单生产”,量身打造业务系统;DIY:软件DIY,你的系统你做主)。