网络编程

1.1 网络

把多台终端(计算机)通过物理线路连接起来,形成网络。便于交换数据、共享信息、组成更强大的逻辑体。

1.1.1 网络通信三要素

【1】IP地址:唯一标识网络上的每一台计算机

两台计算机之间通信的必备有素

【2】端口号:计算机中应用的标号(代表一个应用程序)

0-1024系统使用或保留端口 ,

有效端口0-65536

常见的端口http协议80端口、mysql(3306) oracle(1521)

【3】通信协议:通信的规则

TCP,UDP

1.1.2 TCP/IP参考模型

1.1.3 IP地址分类

127.0.0.1 表示本机IP地址

1.2 InetAddress

表示IP地址信息

package cn.net01;

import java.net.InetAddress;

import java.net.UnknownHostException;

import java.util.Arrays;

public class Test02 {

public static void main(String[] args) throws UnknownHostException {

// 通过IP地址构建InetAddress对象

byte[] ip = new byte[] {(byte) 192,(byte) 168,7,(byte)189};

InetAddress ip1 = InetAddress.getByAddress(ip);

System.out.println(ip1.toString());

System.out.println(ip1.getHostName());

System.out.println(ip1.getHostAddress());

// 给定名称www.baidu.com 获取地址

InetAddress ip3 = InetAddress.getByName("www.baidu.com");

System.out.println(ip3.toString());

InetAddress[] ips = InetAddress.getAllByName("www.baidu.com");

System.out.println(Arrays.toString(ips));

}

}

1.3 TCP编程(A)

案例:服务器向客户端完成一次单向通信

package cn.net02;

import java.io.IOException;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class Server01 {

public static void main(String[] args){

System.out.println("server running....");

// 【1】创建serversocket

ServerSocket serverSocket = null;

try {

serverSocket = new ServerSocket(8000);

} catch (IOException e) {

e.printStackTrace();

}

// 【2】等待客户端链入

Socket clientSocket = null;

try {

// accept 阻塞式方法

clientSocket = serverSocket.accept();

System.out.println("客户端"+clientSocket.getInetAddress().getHostAddress()+"链入");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

// 【3】服务器给客户端发信息

OutputStream out = null;

try {

out = clientSocket.getOutputStream();

String msg = "hello!";

byte[] buf = msg.getBytes();

out.write(buf);

clientSocket.shutdownOutput();

out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

package cn.net02;

import java.io.IOException;

import java.io.InputStream;

import java.net.Socket;

import java.net.UnknownHostException;

import com.sun.org.apache.bcel.internal.generic.NEW;

public class Client01 {

public static void main(String[] args) {

System.out.println("client running...");

// 【1】创建客户端socket

Socket socket=null;

try {

socket = new Socket("192.168.7.194",8000);

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

// 【2】接收服务器发来的信息

InputStream in = null;

try {

in = socket.getInputStream();

byte[] buf = new byte[4];

int len;

StringBuilder sb = new StringBuilder();

while( (len=in.read(buf)) != -1) {

sb.append(new String(buf,0,len));

}

System.out.println("来自服务器的消息:"+sb.toString());

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

常见异常

[1]端口被占用

java.net.BindException: Address already in use: JVM_Bind

at java.net.DualStackPlainSocketImpl.bind0(Native Method)

at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)

at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)

at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)

at java.net.ServerSocket.bind(ServerSocket.java:375)

at java.net.ServerSocket.<init>(ServerSocket.java:237)

at java.net.ServerSocket.<init>(ServerSocket.java:128)

at cn.net02.Server01.main(Server01.java:15)

Exception in thread "main" java.lang.NullPointerException

at cn.net02.Server01.main(Server01.java:24)

[2]服务器没启动

java.net.ConnectException: Connection refused: connect

at java.net.DualStackPlainSocketImpl.connect0(Native Method)

at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)

at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)

at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

[3] SocketTimeoutException 连接超时异常。

案例:服务器和客户端双向通信

package cn.net03;

import java.io.DataInput;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class Server01 {

public static void main(String[] args) throws IOException {

System.out.println("server running....");

ServerSocket serverSocket = new ServerSocket(8000);

Socket clientSocket = serverSocket.accept();

// send msg to client

OutputStream out = clientSocket.getOutputStream();

String msg = "hello client";

DataOutputStream dos = new DataOutputStream(out);

dos.writeUTF(msg);

clientSocket.shutdownOutput();

// receive msg2 from client

InputStream in = clientSocket.getInputStream();

DataInputStream dis = new DataInputStream(in);

String msg2 = dis.readUTF();

System.out.println("来自客户端消息:"+msg2);

clientSocket.shutdownInput();

dos.close();

out.close();

in.close();

dis.close();

}

}

package cn.net03;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;

import javax.print.Doc;

public class Client01 {

public static void main(String[] args) throws UnknownHostException, IOException {

System.out.println("client running...");

Socket socket = new Socket("127.0.0.1",8000);

// receive msg from server

InputStream in = socket.getInputStream();

DataInputStream dis = new DataInputStream(in);

String msg = dis.readUTF();

System.out.println(msg);

socket.shutdownInput();

// send msg to server

OutputStream out = socket.getOutputStream();

DataOutputStream dos = new DataOutputStream(out);

String msg2 = "hello server";

dos.writeUTF(msg2);

socket.shutdownOutput();

in.close();

dis.close();

out.close();

dos.close();

}

}

 

需求:请发送一张图片到服务器。

需求:c/s模式验证用户名密码。

User序列化是客户端和服务器端的全路径一定要一致。

1.4 UDP编程(B)

需求:客户端A向客户端B发信息

客户端A

package cn.net06;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.util.Scanner;

public class ClientA {

public static void main(String[] args) throws IOException {

// 客户端A

DatagramSocket ds = new DatagramSocket(8000);

while(true) {

//System.out.println("请输入");

Scanner sc = new Scanner(System.in);

String msg = sc.nextLine();

// --send msg to ClientB --

System.out.println("开始发送数据:"+msg);

byte[] buf = msg.getBytes();

InetAddress toIp = InetAddress.getLocalHost();

DatagramPacket dp = new DatagramPacket(buf, buf.length, toIp, 9000);

// 构造一个数据报包socket,通过8000用于发送数据报

ds.send(dp);

// --receive msg from clientA--

byte[] recBuf = new byte[1024];

DatagramPacket recDp = new DatagramPacket(recBuf, recBuf.length);

ds.receive(recDp);

String recMsg = new String(recBuf, 0, recDp.getLength());

System.out.println("clientB说:"+recMsg);

}

// ds.close();

}

}

客户端B

package cn.net06;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import java.net.SocketException;

import java.util.Scanner;

public class ClientB {

public static void main(String[] args) throws IOException {

// 创建一个datagram socket用于结束clientA 传入的数据

DatagramSocket ds = new DatagramSocket(9000);

while (true) {

// System.out.println("正在接收信息...");

// --receive msg from clinetA--

byte[] buf = new byte[1024];

DatagramPacket dp = new DatagramPacket(buf, buf.length);

ds.receive(dp);

// 从dp中获取接收的内容

String msg = new String(buf, 0, dp.getLength());

System.out.println("clientA说:" + msg);

// --send msg to clientA--

Scanner sc = new Scanner(System.in);

String sendMsg = sc.nextLine();

byte[] sendBuf = sendMsg.getBytes();

InetAddress toIp = InetAddress.getLocalHost();

DatagramPacket sendPd = new DatagramPacket(sendBuf, sendBuf.length, toIp, 8000);

// DatagramSocket sendDs = new DatagramSocket(9000);

ds.send(sendPd);

}

}

}

java网络编程小白教程的更多相关文章

  1. Java网络编程简明教程

    Java网络编程简明教程 网络编程  计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算 ...

  2. Java - 30 Java 网络编程

    Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接 ...

  3. Java网络编程和NIO详解开篇:Java网络编程基础

    Java网络编程和NIO详解开篇:Java网络编程基础 计算机网络编程基础 转自:https://mp.weixin.qq.com/s/XXMz5uAFSsPdg38bth2jAA 我们是幸运的,因为 ...

  4. 实验五 Java网络编程

    实验五 Java网络编程 实验五 Java网络编程 实验五所涉及的密码学算法及编程思路 ## Java对称加密-DES算法 (1) 获取密钥生成器 KeyGenerator kg=KeyGenerat ...

  5. Java-Runoob-高级编程:Java 网络编程

    ylbtech-Java-Runoob-高级编程:Java 网络编程 1.返回顶部 1. Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.n ...

  6. 从零探索Java网络编程01之 TCP/IP 与 Socket

    最近完成了几项比较简单的项目, 终于是在996里偷了点闲暇时光, 想着来研究研究些啥吧?  一个普通的控制台日志映入了我的眼帘(孽缘呀): (图中使用 SpringBoot 的 log4j 来输出日志 ...

  7. Java网络编程——Socket

    网络是连接不同计算机的媒介,不同的计算机依靠网络来互相通信,即传递数据. Java中与网络编程相关的部分主要是Socket(套接字),它作为一种抽象的结构,实现了与通信相关的各类方法,构成一套完整的通 ...

  8. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  9. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

随机推荐

  1. flask下载文件---文件流

    html: <a name="downloadbtn" class="btn btn-success pull-right" href="/do ...

  2. 1、写在开头的话——Tinking in Java 绪论之我见

    新兵道歉!版式不懂,技术若有错误,请指正,或发我邮箱1300431700@qq.com 不胜感激! 本文力图通过文章总结的形式,阐述自己的观点,迫使自己思考书中精髓,即使跟技术无关! 正文开始! “上 ...

  3. Ajax请求二进制流并在页面展示

    后端代码: public void getIntegralQrcode(HttpServletResponse response, String token) throws BizException, ...

  4. ASP.NET页面之间传值的方式之Cookie(个人整理)

    Cookie Cookie 提供了一种在 Web 应用程序中存储用户特定信息的方法.例如,当用户访问您的站点时,您可以使用 Cookie 存储用户首选项或其他信息.当该用户再次访问您的网站时,应用程序 ...

  5. Linux中检查本地系统上的开放端口列表的方法

    在 Linux 中很少有用于此目的的实用程序.然而,我提供了四个最重要的 Linux 命令来检查这一点. 你可以使用以下四个命令来完成这个工作.这些命令是非常出名的并被 Linux 管理员广泛使用.n ...

  6. Referer图片防盗链

    前几天讲了<nginx下载防盗链>,今天继续说下图片防盗链. 他们两个使用的指令不同,前者使用secure link,并且需要程序配合,但是效果非常好;后者不需要程序配合,根据图片来源来实 ...

  7. java线程学习之synchronized关键字

    关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...

  8. nodejs笔记之路由及util和url模块

    路由是URL到函数的映射:对于最简单的静态资源服务器,可以认为,所有URL的映射函数就是一个文件读取操作.对于动态资源,映射函数可能是一个数据库读取操作,也可能是进行一些数据的处理,等等. 如: /u ...

  9. [转]SQL中 OVER(PARTITION BY) 取上一条,下一条等

    OVER(PARTITION BY)函数介绍 开窗函数               Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返 ...

  10. Weekly Contest 119

    第一题: 973. K Closest Points to Origin  We have a list of points on the plane.  Find the K closest poi ...