java是一种位于Internet上的语言,从语言级上提供了对网络应用程序的支持。且java实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境
1.1计算机网络
学习网络编程,首先要了解计算及网络的意义,计算机网络指的是将位于不同地域具有独立功能的算机,通过通信方式及线程连接起来,由功能完善的的软件来实现资源共享以及信息连接的一种系统。
1.2网络编程的目的
通过网络协议(TCP及UDP)实现资源共享及信息连接
两个端口:服务器端(ServerSocker);客户端( Socket)
如何精确找到网络中的某台计算机:IP+端口
找到计算机后如何高效可靠的传输数据:通信协议(UDP及TCP)
首先需要两个端口,服务器端及客户端
服务器端:通过ServerSocket类创建一个服务端对象,调用accept()实现监听功能
写入数据时有两种方法,可以通过创建OutputStream对象,调用write()方法;
或者通过处理流创建OutputStream对象后,将此对象作为参数,传入到DataOUtputstream对象中,通过DataOUtputstream对象写入服务端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServeDome1 {
//服务器端
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(9999);
System.out.println("服务器启动,等待连接");
Socket socket=serverSocket.accept();//监听,如果监听到有客户顿发送链接需求,就会获得相应的客户端Socket
System.out.println("连接成功");
Scanner scanner=new Scanner(System.in);
InputStream in=socket.getInputStream();
DataInputStream din=new DataInputStream(in);
//满足服务端反馈客户端消息的需要
OutputStream out=socket.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
//也可以使用节点流方式 OutputStream out=socket.getOutputStream();
while(true){
String msg=din.readUTF();
System.out.println("来自客户端的消息"+msg);
System.out.println("返回客户端的消息");
String msg1=scanner.nextLine();
dout.writeUTF(msg1);
}
}
}
客户端 :通过创建Socket对象发送连接请求,注意参数列表中要传入连接对象的IP地址及窗口
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
public class ServeDome2 {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("127.0.0.1",9999);
Scanner scanner=new Scanner(System.in);
InputStream in=socket.getInputStream();
DataInputStream din=new DataInputStream(in);
OutputStream out=socket.getOutputStream();
DataOutputStream dout=new DataOutputStream(out);
while (true) {
System.out.println("客户输入");
String msg=scanner.nextLine();
dout.writeUTF(msg);
String msg1=din.readUTF();
System.out.println("来自服务器的消息"+msg1);
}
}
}
同样需要两个端口;
服务器端:创建DatagrameSocket对象,且必须含有客户端的端口;建立一个byte数组,将数组,以及数组长度作为参数到DatagramPacket对象中,调用DatagrameSocket类中的recieve方法,接收数据到DatagramPacket对象中的数组中去,最终通过String类的构造器以UTF-8的译码格式转换为字符串
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Server {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket=new DatagramSocket(9999);
byte[]b=new byte[1024];
while(true){
DatagramPacket dp=new DatagramPacket(b,b.length);
datagramSocket.receive(dp);
String msg=new String(b,0,dp.getLength(),"UTF-8");
System.out.println(msg);
}
}
}
客户端 :首先创建DatagramSocket对象,然后创建byte数组,通过字符串中的getBytes()方法以UTF-8的格式转换为字节存入byte数组中,再创建DatagramPacket对象,将连接对象的IP地址及端口和数组及数组长度作为参数传入,再通过DategramSocket类中的sent方法,将DatagramPacket对象作为参数传入,进行发送
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket=new DatagramSocket();
while (true){
byte[]b="你好服务器".getBytes("UTF-8");
//将发送的数据以UTF-8的译码格式转换为字节
DatagramPacket datagramPacket=new DatagramPacket(b,b.length, InetAddress.getByName("127.0.0.1"),9999);
//将发送的数据存储到byte数组中
datagramSocket.send(datagramPacket);
}
}
}
5.TCP及UDP编程的区别
UDP是一个面向无连接的协议,通过UDP协议发送的数据报,只管发送,无法保证一定可以安全送到目的地,也无法保证何时可以送达;且客户端与服务端断开连接后无法检测到
TCP是一个面向连接的协议,通过TCP协议发送的数据,必须建立可靠的连接,在客户端断开时,服务端会发生异常,提示断开连接,即就是可以检测到连接是否断开