Java通信之Socket网络编程
2014-12-23 18:04
477 查看
通信协议
通信规则,包含TCP和UDP协议,其中TCP是面向连接的协议,UDP是无连接的协议
相关知识点总结:
ip:
网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。
端口(port):是计算机与外界通讯交流的出口
UDP传输
发送数据:
a、建立UDPSocket服务,在此无需指定端口,也可以将端口加入。如果不指定的话,系统会随机分配一个端口,如第一次运行时端口为1093,那么第二次就会顺延为1094,再运行会一直顺延,因为之前的端口还没有得到释放,所以会顺延端口号值。
b、提供数据,并将数据封装到数据包中
c、通过socket服务的发送功能,将数据包发送出去
d、关闭资源
2)接收数据:
a、定义UDPSocket服务。通常会监听一个端口,其实就是给这个接收网路应用程序定义数字标识,方便于明确哪些数据过来该应用程序可以处理。
b、定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
c、通过socket服务的receive方法接收到的数据存入已定义好的数据包中
d、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
e、关闭资源
在定义接收数据的方法中,仍会在DatagramSocket构造函数中传入DatagramPacket的参数,这是因为收到的数据太多,需要解析,通过将数据封装成对象,易于解析,所以需要传入参数。
注意:
1、发送端与接收端是两个独立的运行程序。
2、在发送端,要在数据包对象中明确目的地IP及端口。
3、在接收端,要指定监听的端口。
TCP传输
TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket。
方法:
创建客户端对象:
Socket():创建空参数的客户端对象,一般用于服务端接收数据
Socket(String host,int port),指定要接收的IP地址和端口号
2)创建服务端对象:ServerSocket(int port):指定接收的客户端的端口
3)Socket accept():监听并接受到此套接字的连接
4)void shutdownInput():此套接字的输入流至于“流的末尾”
5)void shutdownOutput():禁用此套接字的输出流
6)InputStream getInputStream():返回此套接字的输入流,Socket对象调用
7)OutputStream getOutputStream():返回套接字的输出流,Socket对象调用
通信规则,包含TCP和UDP协议,其中TCP是面向连接的协议,UDP是无连接的协议
相关知识点总结:
ip:
网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。
端口(port):是计算机与外界通讯交流的出口
UDP传输
发送数据:
a、建立UDPSocket服务,在此无需指定端口,也可以将端口加入。如果不指定的话,系统会随机分配一个端口,如第一次运行时端口为1093,那么第二次就会顺延为1094,再运行会一直顺延,因为之前的端口还没有得到释放,所以会顺延端口号值。
b、提供数据,并将数据封装到数据包中
c、通过socket服务的发送功能,将数据包发送出去
d、关闭资源
2)接收数据:
a、定义UDPSocket服务。通常会监听一个端口,其实就是给这个接收网路应用程序定义数字标识,方便于明确哪些数据过来该应用程序可以处理。
b、定义一个数据包,用来存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
c、通过socket服务的receive方法接收到的数据存入已定义好的数据包中
d、通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
e、关闭资源
在定义接收数据的方法中,仍会在DatagramSocket构造函数中传入DatagramPacket的参数,这是因为收到的数据太多,需要解析,通过将数据封装成对象,易于解析,所以需要传入参数。
注意:
1、发送端与接收端是两个独立的运行程序。
2、在发送端,要在数据包对象中明确目的地IP及端口。
3、在接收端,要指定监听的端口。
package com.net; import java.io.*; import java.net.*; class UdpS implements Runnable{ private DatagramSocket ds; UdpS(DatagramSocket ds){ this.ds = ds; } @Override public void run() { try{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; DatagramPacket dp= null; while((line= br.readLine())!= null){ byte[] buf = line.getBytes(); dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("127.0.0.1"), 10000 ); ds.send(dp); } } catch(Exception e){ throw new RuntimeException("读写失败!"); } } } class UdpR implements Runnable{ private DatagramSocket ds = null; UdpR(DatagramSocket ds){ this.ds = ds; } @Override public void run() { try{ byte[] buf = new byte[1024]; DatagramPacket dp = null; while(true){ dp = new DatagramPacket(buf,buf.length); ds.receive(dp); int port = dp.getPort(); String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); System.out.println(ip+":"+port+"接受的数据时:"+data); } }catch(Exception e ){ throw new RuntimeException("接受数据失败!"); } } } public class UdpChat{ public static void main(String[] args) throws Exception { new Thread(new UdpS(new DatagramSocket())).start(); new Thread(new UdpR(new DatagramSocket(10000))).start(); } }
TCP传输
TCP分客户端和服务端。客户端对应的对象是Socket,服务端对应的对象是ServerSocket。
方法:
创建客户端对象:
Socket():创建空参数的客户端对象,一般用于服务端接收数据
Socket(String host,int port),指定要接收的IP地址和端口号
2)创建服务端对象:ServerSocket(int port):指定接收的客户端的端口
3)Socket accept():监听并接受到此套接字的连接
4)void shutdownInput():此套接字的输入流至于“流的末尾”
5)void shutdownOutput():禁用此套接字的输出流
6)InputStream getInputStream():返回此套接字的输入流,Socket对象调用
7)OutputStream getOutputStream():返回套接字的输出流,Socket对象调用
//客户端 class TcpClient { public static void main(String[] args) throws Exception { //创建Socket服务 Socket s=new Socket("127.0.0.1",10000); //定义读取流读取文件数据 BufferedReader br=new BufferedReader(new FileReader("TcpDemo.java")); //定义目的,将数据写入到Socket输出流。发给服务端 //BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); PrintWriter pw=new PrintWriter(s.getOutputStream(),true); //定义一个Socket读取流,读取服务端返回信息。 BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=null; while ((line=br.readLine())!=null) { pw.println(line); } s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1. System.out.println(brin.readLine());//接收返回信息 br.close(); s.close(); } } //服务端 class TcpServer { public static void main(String[] args)throws Exception { //创建服务端的ServerSocket服务,并指定监听端口 ServerSocket ss =new ServerSocket(10000); //获取客户端连接 Socket s=ss.accept(); //获取客户端ip System.out.println(s.getInetAddress().getHostName()+" connected......."); //读取Socket读取流中的数据 BufferedReader brin=new BufferedReader(new InputStreamReader(s.getInputStream())); //将接收到的数据写入文件中 PrintWriter out=new PrintWriter(new FileWriter("TcpDemo.txt"),true); //将返回信息写入Socket流的写入流中 BufferedWriter bwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line=null; while ((line=brin.readLine())!=null) { out.println(line); } //PrintWriter pw = new PrintWriter(s.getOutputStream(),true); //pw.println("上传成功"); bwout.write("上传成功!"); bwout.newLine();//换行 bwout.flush();//刷新 out.close();//关流 s.close(); ss.close(); } }
相关文章推荐
- Java网络编程之Socket通信(二)
- Java网络编程——使用NIO实现非阻塞Socket通信
- Java基础知识强化之网络编程笔记02:Socket通信原理图解
- 网络编程之Socket通信(Java)
- java网络编程Socket通信常见异常
- 网络编程_TCP_Socket通信_聊天室_私聊_构思_实现JAVA193-194
- java网络编程之服务端客户端socket简单通信案例
- 第六篇:JAVA网络编程之TCP Socket通信中由read返回值造成的的死锁问题(含代码)
- Java网络通信之Socket编程
- Java网络编程之Socket通信(一)
- 【网络编程6】Java与C语言套接字Socket通信的例子
- 网络编程_TCP_Socket通信原理_多个客户端_聊天室原理JAVA189-190
- 网络编程_TCP_Socket通信_聊天室_客户端多线程_群聊JAVA191-192
- 网络编程之Socket通信(Java)进阶版
- Java网络编程ServerSocket的实现服务器与用户之间的通信的基本步骤
- Java网络编程——使用NIO实现非阻塞Socket通信
- 【网络编程5】Java与Python套接字Socket通信的例子
- java网络编程基础Socket通信应用
- 某科学的超 Java网络编程:Socket通信原理及实例学习