套接字是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 6153 A Secret(扩展KMP模板题)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total ...

  2. 【BZOJ 4007】[JLOI2015]战争调度 DP+搜索+状压

    又是一道思路清新的小清晰. 观察题目,如果我们确定了平民或者贵族的任意一方,我们便可以贪心的求出另一方,至此20分:我们发现层数十分小,那么我们就也是状压层数,用lca转移,线性dp,至此50分(好像 ...

  3. Cube 找规律

    这道题我们经过简单的推测便可得知3个之前特判,四个之后就成为了一般状况,就是我们每侧都是走整个整个的|_|之后零的走|||. 考试的时候包括平时做题,许多正确的感性比理性证明要强得多. #includ ...

  4. 【BZOJ4325】NOIP2015 斗地主 搜索+贪心

    这个东西考试的时候一眼以为状压就压炸了考试又了一下午.....最后我打出来发现后几个点10min都过不去,我大概算了一下,可能是吧.......最后一脸懵逼的我去怂了正解,我们发现只要确定了顺子就可以 ...

  5. 如何使用Photoshop批量扫描保存文档

    以笔主手头上的Canon LIDE 100为例 先安装好扫描仪驱动程序,可使用自带驱动光盘或驱动精灵等程序完成. 打开Photoshop程序,以CS5为例,找到扫描仪入口: 点开高级模式进行配置,笔主 ...

  6. oracle的sequece的使用(主键自增长)

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  7. sls语法:创建file,创建文件夹

    http://blog.kukafei520.net/html/2014/942.html /tmp/aaa.txt: file.managed /tmp/salt_test: file.direct ...

  8. oracleLinux7上安装oracle11g r2(脚本简单配置环境)

    一 环境脚本简单配置 #!/bin/bashmv /etc/yum.repos.d/* /tmpmv iso.repo /etc/yum.repos.d/tar zxvf a.tar.gzmv 7Se ...

  9. vue2学习篇一 $mount()手动挂载

    $mount()手动挂载 //当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: //假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ // ...

  10. Hadoop之计数器与自定义计数器及Combiner的使用

    1,计数器: 显示的计数器中分为四个组,分别为:File Output Format Counters.FileSystemCounters.File Input Format Counters和Ma ...