套接字是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());

 import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner; public class UDPChatDemo { public static void main(String[] args) { new Thread(new Sender()).start();
new Thread(new Receiver()).start();
} } // 发送端
class Sender implements Runnable { @SuppressWarnings("resource")
@Override
public void run() { try {
// 准备套接字对象
DatagramSocket ds = new DatagramSocket(); // 创建一个地址对象
InetSocketAddress isa = new InetSocketAddress("localhost", 9527); // 从控制台来获取数据
Scanner s = new Scanner(System.in); while (true) {
String msg = s.nextLine(); // 将数据封包
DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.getBytes().length, isa); // 发送数据
ds.send(dp); // 判断这个语句是否是exit
if (msg == "exit" || msg != null && msg.equals("exit")) {
break;
}
} } catch (Exception e) {
e.printStackTrace();
} } } class Receiver implements Runnable { @SuppressWarnings("resource")
@Override
public void run() { try {
// 准备套接字对象,绑定端口号
DatagramSocket ds = new DatagramSocket(9527); // 准备数据包
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024); while (true) { // 接收数据
ds.receive(dp); // 获取数据
String msg = new String(dp.getData(), 0, dp.getLength());
if (msg == "exit" || msg != null && msg.equals("exit")) {
break;
} // 获取地址
System.out.print(dp.getAddress() + ":");
System.out.println(msg);
} } catch (Exception e) {
e.printStackTrace();
} } }

TCP

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

  java提供的套接字:

    Socket:客户端套接字

    ServerSocket:服务器端套接字

  客户端基本步骤:

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

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

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

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

    5.关闭套接字

 import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket; public class TCPClientDemo2 { public static void main(String[] args) throws Exception { // 创建客户端的套接字
Socket s = new Socket(); // 发起连接,绑定端口号
s.connect(new InetSocketAddress("localhost", 8980)); // 获取输出流
OutputStream out = s.getOutputStream(); // 写出数据
out.write("我来啦啦啦~~~".getBytes()); // 关闭输出流
s.shutdownOutput(); // 获取输入流
InputStream in = s.getInputStream(); // 读取数据
byte[] bs = new byte[1024];
int len = -1;
while ((len = in.read(bs)) != -1) {
System.out.println(new String(bs, 0, len));
} // 通知服务器端数据已经读取完毕
s.shutdownInput(); // 关闭套接字
s.close(); } }

  服务器端基本步骤:

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

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

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

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

    5. 关闭套接字

 import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket; public class TCPServerDemo { public static void main(String[] args) throws Exception { // 创建一个服务器端套接字对象---绑定端口号
ServerSocket ss = new ServerSocket(9999); // 接受连接
Socket s = ss.accept(); // 获取一个输入流
InputStream is = s.getInputStream(); // 读取数据
byte[] bs = new byte[1024];
int len = -1;
while ((len = is.read(bs)) != -1) {
System.out.println(new String(bs, 0, len));
} // 通知客户端数据读取完毕
s.shutdownInput(); // 关闭套接字
s.close();
ss.close(); } }

注意: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. hdu 1285 确定比赛名次 (拓扑)

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. DataBase -- FUNCTION

    SQL拥有很多课用于计数和计算的内建函数. SELECT function(列) FROM 表 合计函数(Aggregate Functions) Aggregate函数的操作面向一系列的值,并返回一 ...

  3. [Leetcode] Binary tree maximum path sum求二叉树最大路径和

    Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...

  4. Hyperledger Fabric架构详解

    区块链开源实现HYPERLEDGER FABRIC架构详解 区块链开源实现HYPERLEDGER FABRIC架构详解 2018年5月26日 陶辉 Comments 10 Comments hyper ...

  5. java的哈希遍历 hashmap

    Map<String,String> map = new HashMap<String, String>(); map.put("title"," ...

  6. 使用mysqldump命令备份恢复MySQL数据库

    1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文 ...

  7. 2017南宁现场赛E The Champion

    Bob is attending a chess competition. Now the competition is in the knockout phase. There are 2^r2r  ...

  8. 【bzoj1911-[Apio2010]特别行动队】斜率优化

    [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个段的分数的总和最大. [输入格式]  第1行:1个 ...

  9. Red-Black Tree

    A red-black tree is a Binary Search Tree that satisfy the red-black tree properties: 1. Every node i ...

  10. python脚本运行的几种方式

    1.脚本式编程 将如下代码拷贝至 hello.py文件中: print ("Hello, Python!"); 通过以下命令执行该脚本: $ python ./hello.py h ...