一、前期配置:安装tomcat服务器

现代的应用程序都离不开网络,网络编程是非常重要的技术。Java SE提供java.net包,其中包含了网络 编程所需要的最基础一些类和接口。这些类和接口面向两个不同的层次:基于Socket的低层次网络编程和基于URL的高层次网络编程。

所谓高低层次就是通信协议的高低层次,Socket采用TCP、UDP等协议,这些协议属于低层次的通信协议;URL采用HTTP和HTTPS这些属于高层次的通信协议。

低层次网络编程,因为它面向底层,比较复杂,但是“低层次网络编程”并不等于它功能不强大。恰恰相反,正因为层次低,Socket编程与基于URL的高层次网络编程比较,能够提供更强大的功能和更灵活的控 制,但是要更复杂一些。

1、环境配置:

下载Tomcat安装包,解压之后,进入bin目录,复制其路径

进入高级系统设置,配置环境变量

进入path编辑,新建一个环境变量,复制bin地址,之后蒂点击确定

2、运行

进入bin目录,双击startup.bat运行,如果闪退,原因可能是因为在配置java环境中,配置有误,或者没有配置成HOME的模式。

运行之后,发现中文部分乱码,这因为,tomcat在配置时候,输入到控制台的编码格式是UTF-8,如果需要改,就进入conf目录,选择logging.properties日志文件,更改java.util.logging.ConsoleHandler.encoding的值为GBK

注意:运行startup.bat的窗口不要关闭,一旦关闭就认为服务器关闭,

测试服务器是否开启成功,在网浏览器输入http://localhost:8080/,服务器配置成功会进入Tomcat的欢迎页面,如下

如果启动失败,大部分原因是端口已被占用,特别是网站开发者而言,很容易遇到这种问题,因为大部分的网站开发语言的默认端口就是8080端口,所以导致8080容易被占用。

进入conf目录,选择server.xml,右击选择打开方式,选择记事本打开 ,找到更改port的值,就是更该端口号,之后保存

3、简单测试:在浏览器中访问文件

进入webapps目录,新建test文件,里面存放你要访问的文件。webapps目录用来存放应用程序。当tomcat启动时会去加载webapps目录下的应用程序。可以以文件夹、war包、jar包的形式发布应用

要重新运行startup.bat,这是因为,我们刚刚在里面写文件,还没刷新,此时访问的话,浏览器会查找不到该文件,所以要重新运行startup.bat。

之后再网页上输入http://localhost:8089/test/hello.txt

二、网络编程基础

1、网络模型:OSI与TCP/IP

2、ip地址

为实现网络中不同计算机之间的通信,每台计算机都必须有一个与众不同的标识,这就是IP地址, TCP/IP使用IP地址来标识源地址和目的地址。最初所有的IP地址都是32位数字构成,由4个8位的二进 制数组成,每8位之间用圆点隔开,如:192.168.1.1,这种类型的地址通过IPv4指定。而现在有一种新 的地址模式称为IPv6,IPv6使用128位数字表示一个地址,分为8个16位块。尽管IPv6比IPv4有很多优 势,但是由于习惯的问题,很多设备还是采用IPv4。不过Java语言同时指出IPv4和IPv6。

在IPv4地址模式中IP地址分为A、B、C、D和E等5类:

  • A类地址用于大型网络,地址范围:1.0.0.1~126.155.255.254。
  • B类地址用于中型网络,地址范围:128.0.0.1~191.255.255.254。
  • C类地址用于小规模网络,192.0.0.1~223.255.255.254。
  • D类地址用于多目的地信息的传输和作为备用。
  • E类地址保留仅作实验和开发用。

另外,有时还会用到一个特殊的IP地址127.0.0.1,127.0.0.1称为回送地址,指本机。主要用于网络软件 测试以及本地机进程间通信,使用回送地址发送数据,不进行任何网络传输,只在本机进程间通信

3、端口

一个IP地址标识这一台计算机,每一台计算机又有很多网络通信程序在运行,提供网络服务或进行通 信,这就需要不同的端口进行通信。如果把IP地址比作电话号码,那么端口就是分机号码,进行网络 通信时不仅要指定IP地址,还要指定端口号。

TCP/IP系统中的端口号是一个16位的数字,它的范围是0~65535。小于1024的端口号保留给预定义的服 务,如HTTP是80,FTP是21,Telnet是23,Email是25等,除非要和那些服务进行通信,否则不应该使 用小于1024的端口

三、网络编程-基本操作

1、读取网络上的资源

访问网络上的资源,输出到控制台上:

import java.io.*;
import java.net.*;public class One {public static void main(String[] args) throws Exception {URL url=new URL("http","localhost",8089,"/test/hello.txt");//实例化URl对象URLConnection uc=url.openConnection(); //得到网络连接对象InputStream is=uc.getInputStream();//得到网络资源的输入流InputStreamReader isr=new InputStreamReader(is);//转化为字符流BufferedReader br=new BufferedReader(isr);//转化为字符缓冲流读取String word=null;while((word=br.readLine())!=null) {System.out.println(word);}br.close();isr.close();is.close();}
}

2、网络资源的编码和解码

import java.io.*;
import java.net.*;
public class One {public static void main(String[] args) throws Exception {String word="hello,大家好";String newstr=URLEncoder.encode(word);System.out.println("编码后:"+newstr);String decode=URLDecoder.decode(newstr);System.out.println("解码后:"+decode);}
}

四,网络编程-基于TCP协议的操作

1、Socket类与ServerSocket类

java.net包为TCP Socket编程提供了两个核心类:Socket和ServerSocket,分别用来表示双向连接的客户 端和服务器端

Socket常用的构造方法有:

  • Socket(InetAddress address, int port) :创建Socket对象,并指定远程主机IP地址和端口号。
  • Socket(InetAddress address, int port, InetAddress localAddr, int localPort):创建Socket对象,并指定 远程主机IP地址和端口号,以及本机的IP地址(localAddr)和端口号(localPort)
  • Socket(String host, int port):创建Socket对象,并指定远程主机名和端口号,IP地址为null,null 表示回送地址,即127.0.0.1。
  • Socket(String host, int port, InetAddress localAddr, int localPort):创建Socket对象,并指定远程主 机和端口号,以及本机的IP地址(localAddr)和端口号(localPort)。host主机名,IP地址为 null,null表示回送地址,即127.0.0.1。

Socket其他的常用方法有:

  • InputStream getInputStream():通过此Socket返回输入流对象。
  • OutputStream getOutputStream():通过此Socket返回输出流对象。 int getPort():返回Socket连接到的远程端口。
  • int getLocalPort():返回Socket绑定到的本地端口。 InetAddress getInetAddress():返回Socket连接的地址。
  • InetAddress getLocalAddress():返回Socket绑定的本地地址。 boolean isClosed():返回Socket是否处于关闭状态。
  • boolean isConnected():返回Socket是否处于连接状态。 void close():关闭Socket。

注意 Socket与流类似所占用的资源,不能通过JVM的垃圾收集器回收,需要程序员释放。一种方法是可以在finally代码块调用close()方法关闭Socket,释放流所占用的资源。另一种方法通过自 动资源管理技术释放资源,Socket和ServerSocket都实现了AutoCloseable接口。

ServerSocket类常用的构造方法有:

  • ServerSocket(int port, int maxQueue):创建绑定到特定端口的服务器Socket。maxQueue设置连接 的请求最大队列长度,如果队列满时,则拒绝该连接。默认值是50。
  • ServerSocket(int port):创建绑定到特定端口的服务器Socket。最大队列长度是50。

ServerSocket其他的常用方法有:

  • InputStream getInputStream():通过此Socket返回输入流对象。
  • OutputStream getOutputStream():通过此Socket返回输出流对象。
  • boolean isClosed():返回Socket是否处于关闭状态。
  • Socket accept():侦听并接收到Socket的连接。此方法在建立连接之前一直阻塞。
  • void close():关闭Socket。

ServerSocket类本身不能直接获得I/O流对象,而是通过accept()方法返回Socket对象,通过Socket对象取 得I/O流对象,进行网络通信。此外,ServerSocket也实现了AutoCloseable接口,通过自动资源管理技 术关闭ServerSocket。

2、客户端向服务端发送信息:

客户端类Client

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws Exception {Socket socket=new Socket("localhost",9999);//实例化一个基于客户端的Socket对象,参数是目标主机和目标主机的端口号OutputStream os=socket.getOutputStream(); //输出流对象,用于发送信息BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));bw.write("服务器,你好!!,我是客户端");bw.close();socket.close();}}

服务器端Server类:

import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception {ServerSocket ssocket=new ServerSocket(9999);  //实例化一个基于服务器端的socket对象Socket socket =ssocket.accept();//监听9999号端口,有信息发送就立马获取客户端的socket对象InputStream is=socket.getInputStream();//获取内容,转化为输入流BufferedReader br=new BufferedReader(new InputStreamReader(is));System.out.println(br.readLine());br.close();is.close();socket.close();ssocket.close();}
}

3、服务器端响应客户端

客户端类Client

public static void main(String[] args) throws Exception {//向服务器发送信息Socket socket=new Socket("localhost",9999);//实例化一个基于客户端的Socket对象,参数是目标主机和目标主机的端口号OutputStream os=socket.getOutputStream(); //输出流对象,用于发送信息BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(os));bw.write("服务器,你好!!,我是客户端");bw.flush();//刷新//接收服务器信息socket.shutdownOutput(); //把socket关于写的操作先关闭掉InputStream is=socket.getInputStream();//获取信息,转化为输入流BufferedReader br=new BufferedReader(new InputStreamReader(is));System.out.println(br.readLine());//关闭os.close();bw.close();br.close();is.close();}

服务器端类Server:

import java.io.*;
import java.net.*;
public class Server {public static void main(String[] args) throws Exception {//接收客户端发送的信息ServerSocket ssocket = new ServerSocket(9999); //实例化一个基于服务器端的socket对象Socket socket = ssocket.accept(); //调用侦听的功能,侦听9999端口,侦听到了就直接获得该客户端的socket对象InputStream is = socket.getInputStream();//获取客户端内容,转化为输入流BufferedReader br = new BufferedReader(new InputStreamReader(is));//转换为缓冲字符输出流,进行输出System.out.println(br.readLine());//回应客户端OutputStream os = socket.getOutputStream(); //获取输出流BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));//转化为字符缓冲输出流,进行输出bw.write("客户端你好,信息我已收到!!");//关闭bw.flush();bw.close();os.close();br.close();is.close();}
}

4、客户端向服务器端传输对象信息

客户端向服务器端传输的都是数据流,所以要使得客户端能够传输对象信息到服务器端,要把对象序列化

user类:

import java.io.Serializable;public class User implements Serializable{private static final long serialVersionUID = 1L;private String account;  //账户private String password; //密码public String toString() {return "User [account=" + account + ", password=" + password + "]";}public User(String account, String password) {super();this.account = account;this.password = password;}public User() {super();}public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

客户端Client:

import java.io.*;
import java.net.*;public class Client {public static void main(String[] args) throws Exception {//向服务器发送对象信息Socket socket=new Socket("localhost",9999);//实例化一个基于客户端的Socket对象,参数是目标主机和目标主机的端口号OutputStream os=socket.getOutputStream(); //输出流对象,用于发送信息User user=new User("admin","123456");//实例化User对象ObjectOutputStream oos=new ObjectOutputStream(os);//序列化对象oos.writeObject(user);//将指定的对象写入ObjectOutputStream//关闭oos.close();os.close();socket.close();}}

Server类:

import java.io.*;
import java.net.*;
public class Server {public static void main(String[] args) throws Exception {//接收客户端发送的对象信息ServerSocket ssocket = new ServerSocket(9999); //实例化一个基于服务器端的socket对象Socket socket = ssocket.accept(); //调用侦听的功能,侦听9999端口,侦听到了就直接获得该客户端的socket对象InputStream is = socket.getInputStream();//获取客户端内容,转化为输入流ObjectInputStream  ois=new ObjectInputStream(is);//反序列化对象Object obj=ois.readObject();//从ObjectInputStream读取一个对象User user = (User)obj; //转化为User类型if("admin".equals(user.getAccount())&&"123456".equals(user.getPassword())) { //进行账号密码匹配System.out.println("登录成功");}else {System.out.println("用户名或者密码不正确");}//关闭ois.close();is.close();socket.close();ssocket.close();}
}

5、客户端与服务器端自由交流

有两个方法实现,可以直接实现,也可以利用子线程实现

方法一:直接实现

客户端Client:

import java.io.*;
import java.net.*;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {Scanner input = new Scanner(System.in);Socket socket = new Socket("192.168.23.18",9999); // 实例化一个基于客户端的Socket对象,目标主机和目标主机的端口号,目标主机这里采用本电脑的ipwhile(true) {//发送信息OutputStream os = socket.getOutputStream();//得到输出流对象,用于发送信息DataOutputStream dos = new DataOutputStream(os);//实例化数据输出流,将原始Java数据类型写入输出流,应用程序可以使用数据输入流来读取数据dos.writeUTF("客户端说:"+input.next());//发送信息给服务器端dos.flush();//接收响应数据InputStream is = socket.getInputStream();得到输入流对象,用于读取信息DataInputStream dis = new DataInputStream(is);//转化为数据输入流,便于直接读取System.out.println(dis.readUTF());}}
}

服务器端:

import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Server {public static void main(String[] args) throws Exception {//接收客户端发送的对象信息Scanner input = new Scanner(System.in);    ServerSocket ssocket = new ServerSocket(9999); //实例化一个基于服务器端的socket对象Socket socket = ssocket.accept(); //调用监听功能,侦听9999端口,有信息就直接获得该客户端的socket对象while(true) {//接收信息InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);System.out.println(dis.readUTF());//发送信息OutputStream os = socket.getOutputStream();//得到输出流对象DataOutputStream dos = new DataOutputStream(os);//实例化数据输出流对象,发送信息dos.writeUTF("服务器端说:"+input.next());  //将信息发送给客户端dos.flush();}}
}

结果:

方法二:利用子线程实现

客户端Client:

import java.io.*;
import java.net.*;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {Scanner input = new Scanner(System.in);Socket socket = new Socket("192.168.23.18",9999); // 实例化一个基于客户端的Socket对象,目标主机和目标主机的端口号,目标主机这里采用本电脑的ipClientReadThread thread = new ClientReadThread(socket);//实例化子线程:用来读取取服务器端信息new Thread(thread).start(); //子线程启动//由主线程发送数据给服务器端while(true) {OutputStream os = socket.getOutputStream();//得到输出流对象,用于发送信息DataOutputStream dos = new DataOutputStream(os);//实例化数据输出流,将原始Java数据类型写入输出流,应用程序可以使用数据输入流来读取数据dos.writeUTF("客户端说:"+input.next());//发送信息给服务器端}}}

客户端的子线程ClientReadThread:

import java.io.*;
import java.net.*;public class ClientReadThread implements Runnable {private Socket socket;public ClientReadThread(Socket socekt) {this.socket = socekt;}public void run() {while(true) {try {//客户端读取服务器端的响应数据InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);System.out.println(dis.readUTF());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

服务器端:

import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Server {public static void main(String[] args) throws Exception {//接收客户端发送的对象信息Scanner input = new Scanner(System.in);    ServerSocket ssocket = new ServerSocket(9999); //实例化一个基于服务器端的socket对象Socket socket = ssocket.accept(); //调用监听功能,侦听9999端口,有信息就直接获得该客户端的socket对象ServerReadThread thread = new ServerReadThread(socket);//实例化子线程,用来取客户端发送的信息new Thread(thread).start(); //实例化子线程对象,并启动子//由主线程来负责发送数据给客户端while(true) {OutputStream os = socket.getOutputStream();//得到输出流对象DataOutputStream dos = new DataOutputStream(os);//实例化数据输出流对象,发送信息dos.writeUTF("服务器端说:"+input.next());   //将信息发送给客户端}}
}

服务器端的子线程:

import java.io.*;
import java.net.*;public class ServerReadThread implements Runnable {private Socket socket;public ServerReadThread(Socket socket) {this.socket = socket;}public void run() {try {while(true) {// 读取客户端发送过来的数据// 通过该socket得到输入流对象InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);System.out.println(dis.readUTF());}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

结果如下:

6、多个客户端群聊

这也用得子线程实现

客户端Client:

import java.io.*;
import java.net.*;
import java.util.Scanner;public class Client {public static void main(String[] args) throws Exception {Scanner input = new Scanner(System.in);Socket socket = new Socket("192.168.23.18",9999); // 实例化一个基于客户端的Socket对象,目标主机和目标主机的端口号,目标主机这里采用本电脑的ipwhile(true) {//发送信息OutputStream os = socket.getOutputStream();//得到输出流对象,用于发送信息DataOutputStream dos = new DataOutputStream(os);//实例化数据输出流,将原始Java数据类型写入输出流,应用程序可以使用数据输入流来读取数据dos.writeUTF("客户端说:"+input.next());//发送信息给服务器端dos.flush();//接收响应数据InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);System.out.println(dis.readUTF());}}}

客户端的子线程:ClientReadThread

import java.io.*;
import java.net.*;public class ClientReadThread implements Runnable {private Socket socket;public ClientReadThread(Socket socekt) {this.socket = socekt;}public void run() {while(true) {try {//客户端读取服务器端的响应数据InputStream is = socket.getInputStream();DataInputStream dis = new DataInputStream(is);System.out.println(dis.readUTF());} catch (IOException e) {e.printStackTrace();}}}}

服务器端:Server

import java.io.*;
import java.net.*;
import java.util.*;
public class Server {public static ArrayList<Socket> list = new ArrayList<>(); //收集所有群成员对应的socket对象private static Scanner input = new Scanner(System.in);public static void main(String[] args) throws Exception {ServerSocket ssocket = new ServerSocket(9999); //实例化一个基于服务器端的socket对象while(true) {//服务器负责给每个用户端发送信息Socket socket = ssocket.accept(); //调用监听功能,侦听9999端口,有信息就直接获得该客户端的socket对象list.add(socket);System.out.println("当前在线人数是:"+list.size());ServerReadThread thread = new ServerReadThread(socket);//子线程作用就是负责读取发送客户端的信息,并且广播给其它成员客户端new Thread(thread).start(); //启动一个子线程}}
}

服务器的子线程:ServerReadThread

import java.io.*;
import java.net.*;
public class ServerReadThread implements Runnable {private Socket socket;public ServerReadThread(Socket socket) {this.socket = socket;}public void run() {try {while(true) {InputStream is = socket.getInputStream();//获取客户端发来的输入流,socket指的是发送信息的客户端socket对象DataInputStream dis = new DataInputStream(is);//转化为数据输入流//得到发送信息客户端的实现发送的内容String message = dis.readUTF();for (Socket currentSocket : Server.list) { //遍历集合中收集的所有成员的socket对象if(socket!=currentSocket) { //排除掉自己,因为这条信息本身就是自己发的,没必要再广播给自己了OutputStream os = currentSocket.getOutputStream();//得到当前遍历的socket的输出流对象,因为广播就是通过该输出流写出去的DataOutputStream oos = new DataOutputStream(os);oos.writeUTF(message);//把信息广播发送出去}}}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

结果:每运行一次Client类,就产生一个用户,

五,网络编程-基于UDP协议的操作

1、DatagramSocket和DatagramPacket

java.net包中提供了两个类:DatagramSocket和DatagramPacket用来支持UDP通信。这一节先介绍一下 DatagramSocket类,DatagramSocket用于在程序之间建立传送数据报的通信连接。

下DatagramSocket常用的构造方法:

  • DatagramSocket():创建数据报DatagramSocket对象,并将其绑定到本地主机上任何可用的端 口。
  • DatagramSocket(int port):创建数据报DatagramSocket对象,并将其绑定到本地主机上的指定端 口。
  • DatagramSocket(int port, InetAddress laddr):创建数据报DatagramSocket对象,并将其绑定到指定 的本地地址。

DatagramSocket其他的常用方法有:

  • void send(DatagramPacket p):从发送数据报包。
  • void receive(DatagramPacket p):接收数据报包。
  • int getPort():返回DatagramSocket连接到的远程端口。
  • int getLocalPort():返回DatagramSocket绑定到的本地端口。
  • InetAddress getInetAddress():返回DatagramSocket连接的地址。
  • InetAddress getLocalAddress():返回DatagramSocket绑定的本地地址。
  • boolean isClosed():返回DatagramSocket是否处于关闭状态。
  • boolean isConnected():返回DatagramSocket是否处于连接状态。
  • void close():关闭DatagramSocket。

DatagramSocket也实现了AutoCloseable接口,通过自动资源管理技术关闭DatagramSocket。

2、发送端给接收端发送信息:

发送端Sender:

import java.net.*;public class Sender {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket();String content = "hello,好好学习,天天向上!!!";//准备要发送的内容System.out.println(content.length()); //18System.out.println(content.getBytes().length); //30//把要发送的内容和目标主机及端口封装在数据报包对象中DatagramPacket packet = new DatagramPacket(content.getBytes(), content.getBytes().length, InetAddress.getByName("127.0.0.1"), 10086);
//      content.getBytes():要发送的字节数据
//      content.getBytes().length:发送内容字节的长度
//      InetAddress.getByName("127.0.0.1"):目的地的ip
//      10086:目的地主机的端口号socket.send(packet);//执行发送操作System.out.println("发送成功!!!!");}}

接收端:

import java.net.*;public class Sender {public static void main(String[] args) throws Exception {DatagramSocket socket = new DatagramSocket();String content = "hello,好好学习,天天向上!!!";//准备要发送的内容System.out.println(content.length()); //18System.out.println(content.getBytes().length); //30//把要发送的内容和目标主机及端口封装在数据报包对象中DatagramPacket packet = new DatagramPacket(content.getBytes(), content.getBytes().length, InetAddress.getByName("127.0.0.1"), 10086);
//      content.getBytes():要发送的字节数据
//      content.getBytes().length:发送内容字节的长度
//      InetAddress.getByName("127.0.0.1"):目的地的ip
//      10086:目的地主机的端口号socket.send(packet);//执行发送操作System.out.println("发送成功!!!!");}}

结果:

java学习-网络编程相关推荐

  1. java网络编程技术学习笔记(b站【狂神说Java】网络编程实战讲解)

    b站视频链接:[狂神说Java]网络编程实战讲解 文章目录 网络编程 1.1.概述 1.2.网络通信的要素 1.3.IP 1.4.端口 1.5.通信协议 1.6.TCP 文件发送 1.7.UDP 1. ...

  2. Netty:Java 领域网络编程的王者

    一.简介 1. 课程背景 分布式系统的根基在于网络编程,而 Netty 是 Java 领域网络编程的王者. 2. 课程内容 第一部分 NIO 编程,三大组件 第二部分 Netty 入门学习,Event ...

  3. 你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识

    一步一步走来,之前去学习了JUC并发编程知识,现在终于到Java IO网络编程啦,难啊. 一.BIO介绍 引入: 随着技术的发展,两个或以上的程序必然需要进行交互,于是提供了一种端到端的通信,相当于对 ...

  4. 四十六、深入Java的网络编程(下篇)

    @Author:Runsen @Date:2020/6/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  5. 四十五、深入Java的网络编程(上篇)

    @Author:Runsen @Date:2020/6/8 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  6. JAVA的网络编程【转】

    转自 http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能 ...

  7. 将继续深入学习网络编程

    一段时间了,已经可以熟练在Java使用Socket和nio编写服务器应用程序,对一些流行的nio应用框架也有了较深的了解,也自己做了一些实现,并且应用到实践中去. 我想,我需要从三个方面继续深入学习网 ...

  8. java中no1_【Java】-- 网络编程のNo.1

    在现有的网络中,网络通讯的方式主要有两种: TCP(传输控制协议)方式 UDP(用户数据报协议)方式 在网络通讯中,TCP方式就类似于拨打电话,使用该种方式进行网络通讯时,需要建立专门的虚拟连接,然后 ...

  9. JAVA基础 网络编程

    JAVA基础 网络编程 网络我们每天都会用到的,在我们生活中占的地位也在不断的提高,我们下面就简单了解下网络编程的内容. 想要学习网络编程,首先就需要了解网络编程包含哪些内容. 网络编程包括 IP节点 ...

最新文章

  1. Java项目:药店信息管理系统(java+SSM+JSP+layui+maven+mysql)
  2. Objective-C 自动生成文档工具:appledoc
  3. androidwakelock_Android音频播放时wakelock的实现
  4. 软件工程概论课程总结
  5. 魅族适配鸿蒙吗,魅族智能生活发布会新增看点:接入鸿蒙操作系统
  6. 洛谷 P1101 单词方阵
  7. shell脚本输出带颜色字体
  8. gj4 深入类和对象
  9. apache加载php配置
  10. 深度学习目标检测之 YOLO v3
  11. ubuntu server版本安装指南(1)
  12. 服务器修改重生点,服务器设置重生点
  13. 解决atomikos在oracle应用中的XA事务异常 Error in recovery
  14. python斗地主游戏源码_Java写的斗地主游戏源码
  15. android开源系统brvah,BRVAH(让RecyclerView变得更高效)(1)
  16. el table 固定表头和首行_再谈table组件:固定表头和表列
  17. 2021-09-09 一个python代码验证身份证号码
  18. HSL、RGB颜色转换
  19. Redis深入浅出—hash、set
  20. 「小白学Python」Windows安装Python

热门文章

  1. Swiper 轮播图分页器 swiper-pagination无法显示轮播失效 问题
  2. 如何剪辑一个好的短视频?教你一个小技巧,剪辑视频很简单
  3. 机器学习-牛顿迭代法原理和公式推导
  4. 【技术分享】IBM服务器系统安装安装指南
  5. VMware 16 安装window server 2003【附带可能出现的问题和解决方法】
  6. QTP11.00支持的IE版本
  7. c# 导入第三方插件(例如pdf控件),莫名有时候成功有时候出错
  8. Java第二课:汉字的Unicode表位置
  9. 2022.11.5 J 课时1 小结
  10. 2022Java面试题大全,附答案,最新整理