java实现最基础的socket网络通信

来源:互联网 发布:od软件下载 编辑:程序博客网 时间:2024/05/19 00:12

一、网络通信基础

网络中存在很多的通信实体,每一个通信实体都有一个标识符就是IP地址。

而现实中每一个网络实体可以和多个通信程序同时进行网络通信,这就需要使用端口号进行区分。

二、java中的基本网络支持

1、IP地址使用InetAddress类来表示。

     获取InetAddress实例的两个方法为:

    (1)getByName(String host)    根据主机获取对应的InetAddress对象

    (2)getByAddress(byte[] addr)根据IP地址获取InetAddress对象

2、InetAddress提供了三个方法来获取InetAddress实例对应的IP地址和主机名

    (1)String getCanonicalHostName()获取此IP地址的权限定域名

    (2)String getHostAddress()获取InetAddress实例对应的IP地址

    (3)String getHostName()获取此IP地址的主机名

此外InetAddress类使用getLocalHost()方法获取本机IP地址对应的InetAddress实例,使用isReachable()方法测试是否可以到达该地址。

三、java实现简单的TCP/IP通信

服务器端使用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));                }            }        }

原文链接:http://www.cnblogs.com/bewolf/p/4642723.html

原创粉丝点击