网络编程

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. 安装mongodb服务

    摘要:https://www.cnblogs.com/z-x-y/p/9305635.html 欢迎转载,转载请标明出处:https://www.cnblogs.com/z-x-y/p/9305635 ...

  2. 004-CSS怎样让背景充满整个屏幕

    <!doctype html><html><body> ...Your content goes here...</body></html> ...

  3. js大图轮播和倒计时

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. laravel ServiceProvider 加载顺序

    主要看一下代码: public function registerConfiguredProviders(){//读取app的配置,然后,分成两部分Illuminate开始的,和其他的 $provid ...

  5. Xamarin.Forms踩坑集锦(持续更新)

    1.ImageButton控件 问题:ImageButton在切换图片的时候,图片大小会改变. Github Issue:ImageButton changes image size · Issue ...

  6. Typescript 和 Javascript之间的区别

    TypeScript 和 JavaScript 是目前项目开发中较为流行的两种脚本语言,我们已经熟知 TypeScript 是 JavaScript 的一个超集,但是 TypeScript 与 Jav ...

  7. rabbitMq交换机direct、topics

    一: direct 上面我用采用了广播的模式进行消息的发送,现在我们采用路由的方式对不同的消息进行过滤 发送端代码 public class RoutingSendDirect { private s ...

  8. Visual Studio 2010 集成 SP1 补丁 制作 Visual Studio 2010 Service Pack 1 完整版安装光盘的方法

    Now that Visual Studio 2010 SP1 has been released, administrators and developers may wish to install ...

  9. flutter packages.

    connectivity This plugin allows Flutter apps to discover network connectivity and configure themselv ...

  10. Exp1 PC平台逆向破解 20164303 景圣

    逆向及Bof基础实验 实验对象 文件名为pwn1的linux可执行文件. 实验目标:程序正常执行流程weimain调用foo函数,foo函数会简单回显任何用户输入的字符串.该程序同时包含另一个代码片段 ...