套接字是java提供一套进行网络通信的API---TCP/UDP;

ISO七层模型

  物理层 、数据链路层 、传输层-IP、 网络层-UDP/TCP 、会话层 、 表示层、 应用层 ---HTTP FTP POP3 SMTP...

IP地址:在网络中标识计算机地址的---IPv4---用四组整数(0-255)标识一个IP地址---123.125.43.11---IPv6

端口号: 用于指定接收或者发送消息的端口---0-65535---0-1024被计算机内部占用

UDP

  基于流的,不需要建立连接,不可靠,会对数据进行封包,每个包是64k大小,传输效率是比较高。例如直播

  java提供了一套套接字用于UDP通信:

    1.InetSocketAddress("IP地址",端口号):表示IP地址和端口号;

    2.DatgramSocket():用来发送和接收数据包的套接字;

    3.DatagramPacket(byte[] buf, int length, SocketAddress address):用来对数据封包,以便传输;

  发送端基本步骤:

    1.创建发送数据套接字对象;

    2.创建目的地的IP地址和发送端口;

    3.将数据封包;

    4.发送(send(DatagramPacket  dp)方法);

    5.关闭套接字(close());

  接收端基本步骤:

    1.创建接收数据的套接字对象并绑定接收数据的端口;

    2.创建数据封包用来储存数据;

    3.接收数据(receive(DatagramPacket  dp));

    4.关闭套接字(close());

  1. import java.net.DatagramPacket;
  2. import java.net.DatagramSocket;
  3. import java.net.InetSocketAddress;
  4. import java.util.Scanner;
  5.  
  6. public class UDPChatDemo {
  7.  
  8. public static void main(String[] args) {
  9.  
  10. new Thread(new Sender()).start();
  11. new Thread(new Receiver()).start();
  12. }
  13.  
  14. }
  15.  
  16. // 发送端
  17. class Sender implements Runnable {
  18.  
  19. @SuppressWarnings("resource")
  20. @Override
  21. public void run() {
  22.  
  23. try {
  24. // 准备套接字对象
  25. DatagramSocket ds = new DatagramSocket();
  26.  
  27. // 创建一个地址对象
  28. InetSocketAddress isa = new InetSocketAddress("localhost", 9527);
  29.  
  30. // 从控制台来获取数据
  31. Scanner s = new Scanner(System.in);
  32.  
  33. while (true) {
  34. String msg = s.nextLine();
  35.  
  36. // 将数据封包
  37. DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.getBytes().length, isa);
  38.  
  39. // 发送数据
  40. ds.send(dp);
  41.  
  42. // 判断这个语句是否是exit
  43. if (msg == "exit" || msg != null && msg.equals("exit")) {
  44. break;
  45. }
  46. }
  47.  
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51.  
  52. }
  53.  
  54. }
  55.  
  56. class Receiver implements Runnable {
  57.  
  58. @SuppressWarnings("resource")
  59. @Override
  60. public void run() {
  61.  
  62. try {
  63. // 准备套接字对象,绑定端口号
  64. DatagramSocket ds = new DatagramSocket(9527);
  65.  
  66. // 准备数据包
  67. DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
  68.  
  69. while (true) {
  70.  
  71. // 接收数据
  72. ds.receive(dp);
  73.  
  74. // 获取数据
  75. String msg = new String(dp.getData(), 0, dp.getLength());
  76. if (msg == "exit" || msg != null && msg.equals("exit")) {
  77. break;
  78. }
  79.  
  80. // 获取地址
  81. System.out.print(dp.getAddress() + ":");
  82. System.out.println(msg);
  83. }
  84.  
  85. } catch (Exception e) {
  86. e.printStackTrace();
  87. }
  88.  
  89. }
  90.  
  91. }

TCP

  基于流的,需要建立连接,经过了三次握手,理论上不限制数据的大小,传输速率比较低。例如文件的传输

  java提供的套接字:

    Socket:客户端套接字

    ServerSocket:服务器端套接字

  客户端基本步骤:

    1.创建客户端套接字对象;

    2.发起连接,并绑定连接地址;

    3.获取输出流,写出数据;

    4.通知服务器端数据写出完毕;

    5.关闭套接字

  1. import java.io.InputStream;
  2. import java.io.OutputStream;
  3. import java.net.InetSocketAddress;
  4. import java.net.Socket;
  5.  
  6. public class TCPClientDemo2 {
  7.  
  8. public static void main(String[] args) throws Exception {
  9.  
  10. // 创建客户端的套接字
  11. Socket s = new Socket();
  12.  
  13. // 发起连接,绑定端口号
  14. s.connect(new InetSocketAddress("localhost", 8980));
  15.  
  16. // 获取输出流
  17. OutputStream out = s.getOutputStream();
  18.  
  19. // 写出数据
  20. out.write("我来啦啦啦~~~".getBytes());
  21.  
  22. // 关闭输出流
  23. s.shutdownOutput();
  24.  
  25. // 获取输入流
  26. InputStream in = s.getInputStream();
  27.  
  28. // 读取数据
  29. byte[] bs = new byte[1024];
  30. int len = -1;
  31. while ((len = in.read(bs)) != -1) {
  32. System.out.println(new String(bs, 0, len));
  33. }
  34.  
  35. // 通知服务器端数据已经读取完毕
  36. s.shutdownInput();
  37.  
  38. // 关闭套接字
  39. s.close();
  40.  
  41. }
  42.  
  43. }

  服务器端基本步骤:

    1. 创建服务器端套接字,绑定端口号

    2. 接受连接,获取到一个Socket对象

    3. 获取输入流,读取数据

    4. 通知客户端数据读取完毕

    5. 关闭套接字

  1. import java.io.InputStream;
  2. import java.net.ServerSocket;
  3. import java.net.Socket;
  4.  
  5. public class TCPServerDemo {
  6.  
  7. public static void main(String[] args) throws Exception {
  8.  
  9. // 创建一个服务器端套接字对象---绑定端口号
  10. ServerSocket ss = new ServerSocket(9999);
  11.  
  12. // 接受连接
  13. Socket s = ss.accept();
  14.  
  15. // 获取一个输入流
  16. InputStream is = s.getInputStream();
  17.  
  18. // 读取数据
  19. byte[] bs = new byte[1024];
  20. int len = -1;
  21. while ((len = is.read(bs)) != -1) {
  22. System.out.println(new String(bs, 0, len));
  23. }
  24.  
  25. // 通知客户端数据读取完毕
  26. s.shutdownInput();
  27.  
  28. // 关闭套接字
  29. s.close();
  30. ss.close();
  31.  
  32. }
  33.  
  34. }

注意:receive/connect/accept/read/write都会产生阻塞

java网络编程(套接字)的更多相关文章

  1. Java网络编程--套接字Socket

    一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...

  2. UNIX网络编程——套接字选项(心跳检测、绑定地址复用)

    /* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( in ...

  3. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  4. UNIX网络编程——套接字选项(SOL_SOCKET级别)

    #include <sys/socket.h> int setsockopt( int socket, int level, int option_name,const void *opt ...

  5. <网络编程>套接字介绍

    1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口 ...

  6. UNIX网络编程——套接字选项

    http://www.educity.cn/linux/1241288.html 有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt( ...

  7. UNIX网络编程——套接字选项(SO_REUSEADDR)

    1.一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用. SO_REUSEADDR用于对TCP套接字处于TIME_WAIT状态下的sock ...

  8. UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

    有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项. int getsockopt(int sockfd,int level,int optname,void *op ...

  9. UNIX网络编程——套接字选项(setsockopt)

    setsockopt的一些用法: close socket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockop ...

  10. 【python】网络编程-套接字常用函数

随机推荐

  1. java基础知识(一)- 数据类型

    Java有两大数据类型: 基本数据类型,基本数据类型都可以直接分配到栈中 引用数据类型,引用存放在栈中,对象本身存放在堆中 基本数据类型共有四类八种 第一类:字符型(char) 第二类:逻辑型(boo ...

  2. 在程序内部跳转到下一个页面 和 向另一个servlet发起跳转

    request.getRequestDispatcher("/success.html").forward(request,response); request.getReques ...

  3. 【题解】【CF Round #278】Tourists

    圆方树第二题…… 图中询问的是指定两点之间简单路径上点的最小权值.若我们建出圆方树,圆点的权值为自身权值,方点的权值为所连接的圆点的权值最小值(即点双连通分量中的最小权值).我们可以发现其实就是这两点 ...

  4. HDU 4417 划分树写法

    Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability re ...

  5. vsftpd主动模式和被动模式的区别

    何为主动模式,何为被动模式 1.ftp采用两个端口控制: 20端口用于数据传输. 21端口用于控制,或指建立TCP连接. 2.主动方式连接过程: [注意]:C表示客户端 S表示服务器端 S端要开启20 ...

  6. 在线输入RGB更改背景色

    HTML: <!DOCTYPE html><html> <head> <meta http-equiv="Content-Type" co ...

  7. c++ STL(2)

    Vector: #include "stdafx.h" #include<iostream> #include<vector> #include<al ...

  8. CSS盒模型之margin解析

    原文链接:http://www.jianshu.com/p/ccb534e9b588 文章分为: margin的使用 margin的叠压现象 margin的子债父偿现象 一.margin的使用 HTM ...

  9. HDU1232 畅通工程---(经典并查集应用)

    http://acm.hdu.edu.cn/showproblem.php?pid=1232 畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory ...

  10. bzoj1574 [Usaco2009 Jan]地震损坏Damage

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1574 [题解] 贪心把report的点的旁边所有点破坏即可. # include <s ...