两个Java应用程序可以通过一个双向的网络通讯连接实现数据交换,这个双向链路的一端称为一个Socket。java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向链路的client端和server端。建立连接时所需的寻址信息为远程计算机的IP地址和端口号(port number)。

注: 网络编程不等于网站编程,网站编程是基于网络编程基础之上。

一.、计算机网络

  计算机网络把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而是众多的计算机可以方便的互相传递信息、共享硬件、软件、数据信息等资源。

计算机网络主要用于资源共享、信息传输与集中处理、均衡符合与分布处理、综合信息服务(综合业务数字网络/www、ISDN).

1、网络通讯模型

为了使两个节点之间能进行对话,必须在他们之间建立网络通信接口,使彼此之间能进行信息交换。接口包括 实现结点之间的信息传送的硬件设备 和 约定双方进行通讯时对速率、传输代码、代码结构、传输控制步骤、出错控制等标准的网络通讯协议。

(1)通讯协议分层

采用层次方式建立计算机网络模型,规定好每层的接口标准,同层之间可以通讯,上一层可以调用下一层,各层互不影响。

(2)数据传输过程

图1-1  数据封装

图 1-2 数据解封

2、IP与端口号

IP(Internet  Protocol)协议是网际层的主要协议,支持网络互联的数据报通讯,它提供的主要功能有:无连接数据包传送、数据报路由选择和差错控制等。

IP地址为主机提供了独一无二的网络地址,分为IPv4(4字节)和IPv6(8字节)两种,由网络位和主机位组成。子网掩码使用1表示网络位、0表示主机位,用于判断两个IP是否在同一个网上。

端口号占2字节,分TCP端口和UDP端口两种,每一个都有65536个端口。注意端口号1024以下的被系统占用,如:80是HTTP端口、21是FTP端口、25是SNTP(简单邮件传输协议的端口)、100是POP3(邮件接收协议)的端口。服务器端口固定、客户端端口随机生成

3、TCP/UDP协议

(1)TCP(transmission controlprotocol)

TCP是一种面向连接的协议,可以提供可靠的、端到端的字节流通讯的协议。TCP连接是字节流而非报文流。如系统登录、文件传输等。

(2)UDP(user data protocol)

UDP向应用程序提供一种发生封装的原始IP数据报的方法、并且在发送时无需建立连接,传输速率快,是一种不可靠的连接。如视频和音频传输、实时通信、游戏等。

二、TCP通讯

1、点对点通讯

(1)Server端

  1 import java.io.*;
2 import java.net.*;
3 public class Server
4 {
5 public static void main(String args[])
6 {
7 try{
8 ServerSocket server = new ServerSocket(5888);//监听5888端口
9 //同步式点对点Socket编程,读写顺序不能变
10 while(true) {
11 //接入客户端
12 Socket socket = server.accept();
13 //获取输入输出流,TCP传输的是字节流
14 InputStream is = socket.getInputStream();
15 OutputStream os = socket.getOutputStream();
16 //套接输入输出流为 处理流+打印流
17 BufferedReader in = new BufferedReader(new InputStreamReader(is));
18 PrintWriter out = new PrintWriter(os);
19
20 //服务器与客户端发送消息
21 BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
22 String msg = "Server:你好,你已经可以和我通话了!"; //服务端发送的消息
23 while(!msg.equals("bye")) {
24 //发送服务端的消息
25 out.println(msg);
26 out.flush();
27 //打印消息记录
28 System.out.println("Server:" + msg);//先打印服务端的消息
29 System.out.println("Client:" + in.readLine());//再打印客户端消息
30 //读取服务端输入的信息
31 msg = sin.readLine();
32 }
33
34 //关闭连接
35 in.close();
36 out.close();
37 socket.close();
38 server.close();
39 }
40 }catch(IOException e){
41 System.out.println("服务端运行出错");
42 }
43 }
44 }
45

(2)Client端

  1 import java.io.*;
2 import java.net.*;
3 public class Client
4 {
5 public static void main(String args[])
6 {
7 try{
8 //连接服务器IP的端口号(客户端发送数据的端口不定)
9 Socket socket = new Socket("127.0.0.1",5888);
10
11 //获取输入输出流,TCP传输的是字节流
12 InputStream is = socket.getInputStream();
13 OutputStream os = socket.getOutputStream();
14 //套接输入输出流为 缓冲流+打印流
15 BufferedReader in = new BufferedReader(new InputStreamReader(is));
16 PrintWriter out = new PrintWriter(os);
17
18 //客户端与服务端发送消息
19 BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
20
21 System.out.println("Server:" + in.readLine());
22 String readline = sin.readLine();
23
24 while (!readline.equals("bye")){
25 out.println(readline);
26 out.flush();
27
28 System.out.println("Client:" + readline);
29 System.out.println("Server:" + in.readLine());
30
31 readline = sin.readLine();
32 }
33 os.close();
34 is.close();
35 socket.close();
36 }catch(Exception e){
37 System.out.println("Error" + e);
38 }
39 }
40 }

2、异步式通讯

如Tomcat、Jboss

三、UDP通讯

1、简单的UDP通讯

(1)服务端

  1 import java.net.*;
2 import java.io.*;
3
4 public class TestUDPServer
5 {
6 public static void main(String args[]) throws Exception
7 {
8 //设置缓冲区大小
9 byte buf[] = new byte[1024];
10 //设置接收数据报的缓冲区
11 DatagramPacket dp = new DatagramPacket(buf, buf.length);
12 //设置服务端接受信息的端口
13 DatagramSocket ds = new DatagramSocket(5678);
14 while(true)
15 {
16 //接受数据报
17 ds.receive(dp);
18 //转换long类型数据
19 ByteArrayInputStream bais = new ByteArrayInputStream(buf);
20 DataInputStream dis = new DataInputStream(bais);
21 System.out.println(dis.readLong());
22 //转换字符数组为字符串,dp.getLength获取数据串长度
23 //System.out.println(new String(buf,0,dp.getLength()));
24 }
25 }
26 }

(2)客户端

  1 import java.net.*;
2 import java.io.*;
3
4 public class TestUDPClient
5 {
6 public static void main(String args[]) throws Exception
7 { //将一个long类型装换成字符数组
8 long n = 10000L;
9 ByteArrayOutputStream baos = new ByteArrayOutputStream();
10 DataOutputStream dos = new DataOutputStream(baos);
11 byte[] buf = baos.toByteArray();
12 dos.writeLong(n);
13 //将字符串转换成字符数组
14 //byte[] buf = (new String("Hello")).getBytes();
15
16 //封装数据报
17 DatagramPacket dp = new DatagramPacket(buf, buf.length,
18 new InetSocketAddress("127.0.0.1", 5678));
19 //设置客户端发送端口
20 DatagramSocket ds = new DatagramSocket(9999);
21 //发送数据报
22 ds.send(dp);
23 //关闭流
24 ds.close();
25 }
26 }

Java笔记 - Socket编程的更多相关文章

  1. 【JAVA】Socket 编程

    对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket.服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了.首先ServerSocket将 ...

  2. 【转】java的socket编程

    转自:http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html 一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台 ...

  3. 基于java的socket编程

    #开头的废话#学习java已经半个月了,原本在抠教材里面的字眼时,觉得教材好厚,要看完不知道要到猴年马月去了.突然在网上看到一个教程,里面老师说学编程语言书不用太细看,看个大概,知道里面讲些什么就好, ...

  4. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  5. JAVA之Socket编程

    网上对Socket的诠释很多,也很全,在这里我就不多说了,总之,现在的网络处处都在使用Socket.本帖是一个Socket的例子,用来模拟一个简单的登录系统,只有核心代码,访问数据库.输入神马的统统没 ...

  6. Java 多线程Socket编程通讯--实现聊天室代码

    1.创建服务器类 import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import ja ...

  7. python笔记--socket编程

    socket编程 osi七层模型 socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族 ...

  8. Java笔记--网络编程

    1.IP地址:InetAddress类 --唯一的标识Internet上的计算机 --本地回环地址(hostAddress)127.0.0.1 主机名(hostName):localhost //根据 ...

  9. Java NIO Socket编程实例

    各I/O模型优缺点 BIO通信模型 BIO主要的问题在于每当有一个新的客户端请求接入时,服务端必须创建一个新的线程处理新接入的客户端链路,一个线程只能处理一个客户端连接 线程池I/O编程 假如所有可用 ...

随机推荐

  1. Mybatis枚举转换

    自定义mybatis枚举转换,原理是如果用户没有定义自己的枚举转换工具,mybatis在解析枚举类时会自动获取mybatis的BaseTypeHandler,来转换枚举类,我们只需要重写这个枚举转换器 ...

  2. Java之Java的文件结构(才不是叛教!)

    Java从入门到恰饭之文件结构,使用IDEA开发. 新建包 包名一般选择公司域名(https://tieba.baidu.com/)的反转 创建完成是这样的 对应的三层文件夹 我们创建一个类 pack ...

  3. mysql开启慢查询报错:

    1.进入mysql命令行:#mysql -uroot -p123456,执行下面的命令开启慢查询报错: set global slow_query_log=on; set global long_qu ...

  4. 如何在Windows10操作系统下安装superset步骤分享

    superset是一个轻量级自助式BI框架,以优雅的界面和根据数据表动态生成数据为主要特点. 一. 环境 windows 10 64位 Python 3.7 二. 安装步骤 安装Python 建议安装 ...

  5. mysql 两张表取总合 和差集

    SELECT id AS kid, NAME, IF (t1.kpi, t1.kpi, 0) AS kpi, t1.sort, STATUS, t1.kpi_idFROMform_kpi_nameLE ...

  6. DOM——创建元素的三种方式

    document.write()  document.write('新设置的内容<p>标签也可以生成</p>'); innerHTML  var box = document. ...

  7. 依赖背包优化——ural1018,金明的预算方案

    经典题了,网上博客一大堆O(nCC)的做法,其实是可以将复杂度降到O(nC)的 参考依赖背包优化(泛化物品的并) 根据背包九讲,求两个泛化物品的和复杂度是O(CC)的,所以依赖背包暴力求解的复杂度是O ...

  8. Spring声明式事务的实现方式选择(JDK动态代理与cglib)

    1.简介 Spring声明式事务的具体实现方式是动态决定的,与具体配置.以及事务代理对象是否实现接口等有关. 2.使用JDK动态代理的情况 在满足下面两个条件时,Spring会选择JDK动态代理作为声 ...

  9. 牛客多校第六场 D move 枚举/机智题

    题意: 有个家伙装东西,他的策略是贪心,每次装进去这个盒子能装下的最大的东西,直到把这个盒子装满,再去装下一个盒子. 给出盒子的数量k和一些东西的重量,问你最小需要多大的盒子才能以这种贪心策略装下. ...

  10. scala实现读取Oracle数据

    用scala实现读取oracle数据 增加oralce的jar包后 package cn.bigdata.scala.oracle import java.sql.{DriverManager, Co ...