网络编程

网络编程三要素:ip地址,端口,协议

两个DOS命令:ipconfig--查看本机ip地址  ping+ip地址--测试本机与指定ip地址间通信是否有问题

特殊ip地址:127.0.0.1--回环地址(表示本机)  x.x.x.255--广播地址  x.x.x.0--网络地址

ip地址:

对ip地址的获取和操作,java提供InetAddress类

  没有构造方法:

    三种情况会没有构造方法:成员全部是静态  单例设计模式  类中有静态方法返回该类的对象

    InetAddress有4静态方法根据不同参数返回InetAddress对象,用这个对象获取和操作ip

端口号:

  端口号是正在运行的程序的标识,有效端口从0到65535,其中0到1024是系统使用或保留端口

协议:

  UDP:将数据源和目的封装在数据报中,不需要建立连接,每个数据报大小不超过64k,无连接,不可靠,速度快

  TCP:建立连接,三次握手完成连接,可靠协议,效率稍低

  一般一个软件既有UDP又有TCP

Socket:

  网络上具有唯一标识的ip地址和端口号组合在一起才能构成唯一能识别的标识符套接字,即Sockt包含了IP地址+端口

  网络编程也就是Socket编程

  通信两端都有Socket,网络通信就是Socket间的通信,数据在两个Socket间通过IO传输

UDP和TCP使用不同的Socket

TCP Socket:

  客户端套接字:java.net.Socket,直接子类:SSLSocket

  服务端套接字:java.net.ServerSocket,直接子类:SSLServerSocket

UDP Socket:java.net.DatagramSocket,直接子类:MuticastSocket

UDP协议发送数据:

  创建发送端Socket对象

  创建数据并把数据打包

  调用Socket对象的send方法发送数据包

  释放资源

class UDPSendDemo{
public static void main(String[] args) throws IOException {
//创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
//创建数据并把数据打包
//通过DatagramPacket(byte[] buf, int length, IneAddress address, int port)打包数据
//要发送的具体数据
byte[] buf = "hello".getBytes();
//长度
int length = buf.length;
//远程主机ip地址对象
InetAddress address = InetAddress.getByName("192.168.12.92");
        //远程主机端口号
int port = 10086;
DatagramPacket dp = new DatagramPacket(buf,length,address,port);
ds.send(dp);
ds.close();
}
}

UDP协议接收数据:

  创建接收端Socket对象

  创建一个数据包(接收容器)

  调用Socket对象的接收方法接收数据

  解析数据包,并显示

  释放资源

class UDPReceiveDemo{
public static void main(String[] args) throws IOException{
//创建接收端Socket对象,因为是接收端,所以要指定一个端口号
DatagramSocket ds = new DatagramSocket(10086);
//创建一个数据包接收容器
byte[] buf = new byte[1024];
int length = buf.length;
DatagramPacket dp = new DatagramPacket(buf,length);
//调用Socket的接收方法接收数据
//阻塞式方法,接收端运行后,不接受到发送端数据报时,会一直运行着
ds.receive(dp);
//解析数据包并展示,获取ip,获取数据
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
byte[] buf2 = dp.getData();
int len = dp.getLength();
String s = new String(buf2,0,len);
System.out.println("发送的数据是"+ s);
//释放资源
ds.close();
}
}

TCP协议要一定要先开服务端

TCP发送数据:

  创建发送端Socket对象,如果成功,说明连接已经建立

    连接被拒绝:java.net.ConnectException:Connect refused:connect

  获取输出流,写数据

  释放资源

class TCPSendDemo{
public static void main(String[] args) throws IOException{
//创建发送端Socket对象
Socket s = new Socket("192.168.12.92",8888);
//获取输出流,写数据
OutputStream os = s.getOutputStream();
os.write("hello".getBytes());
     //通知服务器发送完毕
     s.shutdownOutput();
//释放资源
s.close();
}
}

TCP接收数据

  创建接收端Socket对象

  监听客户端连接,返回一个对应的Socket对象

  获取输入流,读取数据并展示

  释放资源

class TCPServerDemo{
public static void main(String[] args) throws IOException{
//创建接收端Socket对象
ServerSocket ss = new ServerSocket(8888);
//监听客户端连接,返回一个对应的Socket对象
//accept方法侦听并接收此套接字的连接,在连接传入前一直阻塞
Socket s = ss.accept();
//获取输入流,读取数据并展示
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
int len = is.read(buf);//阻塞式方法
String str = new String(buf,0,len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+"-----"+str);
//释放资源
s.close();
}
}

释放资源

posted on 2017-08-28 21:13  zawjdbb  阅读(129)  评论(0编辑  收藏  举报

导航