网络编程
来源:互联网 发布:阿里云虚拟主机这么用 编辑:程序博客网 时间:2024/05/01 07:22
网络编程三要素
IP,端口,协议。
一、IP:在网络上的唯一标识,其实每台电脑连接互联网都有自己的IP分配值,之前都是IPv4的但在2011年已经用尽,现在正向ipv6时代迈进
二、端口:在设备上的唯一标识,范围在0--65535之间,编写网络应用就需要绑定一个端口号,尽量使用1024以上的,1024以下的基本上都被系统程序占用了。
三、协议: 为计算机网络中进行数据交换而建立的规则、标准或约定的集合。
UDP
面向无连接,数据不安全,速度快。不区分客户端与服务端。
TCP
面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。
三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据
Socket套接字
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO流传输。
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和port
UDP的传输
发送Send
创建DatagramSocket, 随机端口号
创建DatagramPacket, 指定数据, 长度, 地址, 端口
使用DatagramSocket发送DatagramPacket
关闭DatagramSocket
public static void main(String[] args) throws IOException {String s = "qubuqusaniao";//要发送的数据DatagramSocket ds = new DatagramSocket();//创建Socket对象 相当于创建码头DatagramPacket dsp = //创建Packet 相当于创建集装箱new DatagramPacket(s.getBytes(), s.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);ds.send(dsp); //发送数据ds.close();}接收Receive
创建DatagramSocket, 指定端口号
创建DatagramPacket, 指定数组, 长度
使用DatagramSocket接收DatagramPacket
关闭DatagramSocket
从DatagramPacket中获取数据
public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(12345); //创建Socket相当于创建一个码头DatagramPacket packet = new DatagramPacket(new byte[1024],1024);//创建Packet相当于创建一个集装箱socket.receive(packet);byte[] arr = packet.getData(); //从集装箱中获取数据int len = packet.getLength(); //获取发过来的有效字节个数System.out.println(new String(arr,0,len));socket.close();}
UDP传输的优化
send
public static void main(String[] args) throws IOException {DatagramSocket ds = new DatagramSocket();//创建Socket对象 相当于创建码头Scanner sc = new Scanner(System.in);//键盘录入while(true){String line = sc.nextLine();//接收键盘录入内容if("quit".equals(line)){ //相当于图形化界面的差号break;}DatagramPacket dsp = //创建Packet 相当于创建集装箱new DatagramPacket(line.getBytes(), line.getBytes().length,InetAddress.getByName("127.0.0.1"),12345);ds.send(dsp); //发送数据}ds.close();}
<strong>receive</strong>
public static void main(String[] args) throws IOException {DatagramSocket socket = new DatagramSocket(12345); //创建Socket相当于创建一个码头DatagramPacket packet = new DatagramPacket(new byte[1024],1024);//创建Packet相当于创建一个集装箱while(true){socket.receive(packet);byte[] arr = packet.getData(); //从集装箱中获取数据int len = packet.getLength(); //获取发过来的有效字节个数String ip = packet.getAddress().getCanonicalHostName();//获取IP地址int port = packet.getPort(); //获取端口号System.out.println(ip + ":" + port + ":" + new String(arr,0,len));}}}
TCP传输
客户端
普通方式和优化方式
public static void main(String[] args) throws UnknownHostException, IOException {//demo();Socket socket = new Socket("127.0.0.1",9999);//创建Socket,并指定IP和端口号BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//对输入流包装PrintStream ps = new PrintStream(socket.getOutputStream());ps.println("坚持坚持在坚持");//向服务器写出数据System.out.println(br.readLine());//读取服务器的内容并打印socket.close();}private static void demo() throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1",9999);//创建Socket,并指定IP和端口号InputStream is = socket.getInputStream();OutputStream os = socket.getOutputStream();byte[] arr = new byte[1024];int len = is.read(arr);System.out.println(new String(arr,0,len));os.write("因为一分耕耘一分收获".getBytes());}}服务端
普通方式
private static void demo() throws IOException {ServerSocket server = new ServerSocket(9999);//创建ServerSocket t对象并连接端口Socket socket = server.accept(); //接收客户端的请求InputStream is = socket.getInputStream(); //获取输入流OutputStream os = socket.getOutputStream();// 获取输出流os.write("坚持学习".getBytes()); //字符串写到客户端byte[] arr = new byte[1024]; //创建字节数组int len = is.read(arr); //将数据读取到字节数组中System.out.println(new String(arr,0,len));//将数组转化为字符串server.close();socket.close();}优化方式
private static void demo1() throws IOException {ServerSocket server = new ServerSocket(9999);//创建ServerSocket t对象并连接端口Socket socket = server.accept(); //接收客户端的请求BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));//对输入流包装PrintStream ps = new PrintStream(socket.getOutputStream());System.out.println(br.readLine());//读取服务器的内容并打印ps.println("虽然很艰难"); //向服务器写出数据socket.close();//关闭套接字,顺便关闭流}多线程方式
public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(9999);//创建ServerSocket t对象并连接端口while(true){final Socket socket = server.accept(); //接收客户端的请求new Thread(){public void run(){try {BufferedReader br= new BufferedReader(new InputStreamReader(socket.getInputStream()));//对输入流包装PrintStream ps = new PrintStream(socket.getOutputStream());System.out.println(br.readLine());//读取服务器的内容并打印ps.println("虽然很艰难"); //向服务器写出数据socket.close();//关闭套接字,顺便关闭流} catch (IOException e) {e.printStackTrace();}}}.start();
练习:客户端向服务器写字符串,服务器将字符串反转后写回,客户端再次读取到是反转后的字符串
客户端:
public static void main(String[] args) throws UnknownHostException, IOException {Socket socket = new Socket("127.0.0.1", 23445);//创建客户端对象并指定IP和端口BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintStream ps = new PrintStream(socket.getOutputStream());Scanner sc = new Scanner(System.in);ps.println(sc.nextLine()); //将键盘录入的字符串放在服务器中System.out.println(br.readLine());//打印反转后的字符串socket.close();}服务端:
public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(23445);//创建服务端服务器,并连接端口System.out.println("服务器启动");while(true){final Socket socket = server.accept();//接受客户端的数据new Thread(){public void run(){try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintStream ps = new PrintStream(socket.getOutputStream());String line = br.readLine();//获取字符串line = new StringBuilder(line).reverse().toString();//将字符串放在Stringbuilder中反转并转回字符串socket.close();} catch (IOException e) {e.printStackTrace();}}}.start();}
<pre name="code" class="java">
0 0
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- 网络编程
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
- 元素竖直居中的实现
- 显式调用构造函数和析构函数
- 读取文件方法大全
- [线段树+离线处理] upcoj 2224 Boring Counting
- 网络编程
- HashMap和Hashtable的区别
- msyql中文插不进去的情况
- 今天朋友问我关于char数组为什么不是“good and abc”
- Eclipse常用快捷键
- AudioStreamBasicDescription结构说明
- 集成spring3,hibernate4
- android解析xml文件的方式(其一)
- HashMap<String,short>的问题