- 网络通信:
网络通讯三要素:
1. IP地址: 每台主机都必须有一个唯一的IP地址,IP地址是一个逻辑地址
2.端口号: 端口用一个整数型标识符来表示,即端口号。
在互联网上传输的数据都包含有用来识别目的地的IP地址和端口号。
3.传输协议:网络通讯时的传输规则。
IP协议
UDP协议:面向无连接,传输速度快,数据封装成报传输,每个包不超过64k,传输不可靠;
TCP协议:面向建立连接,可传输大量数据,通过3次握手建立连接,效率稍低,但是传输可靠。
套接字(Socket):
将应用程序和端口连接起来你,相当于一个“插座”
UDP连接发送机制:
(1) 先建立发生端的udp服务,通过new DatagramSocket();
(2)将数据进行封装打包并发生,通过new DatagramPacket();
(3)通过send()完成发送;
(4)关闭连接;
UDP接收机制:
(1) 先建立发生端的udp服务,通过new DatagramSocket();
(2)建立用于接收数据的包,new DatagramPacket();
(3)接收数据,receive();
(4)取出数据并打印;
(5)关闭连接
package mydemo2_3;
import java.net.*;
import java.io.*;
public class SendDemo {
public static void main(String[] args) {
DatagramSocket ds=null;
DatagramPacket dp=null; //UDP 协议发送端代码
BufferedReader br=null;
try {
ds=new DatagramSocket();
br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while((line=br.readLine())!=null) {
byte[] buf=line.getBytes();
dp=new DatagramPacket(buf,0,buf.length,InetAddress.getLocalHost(),8080);
ds.send(dp);
}
} catch(SocketException e) {
e.printStackTrace();
} catch(UnknownHostException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
ds.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
package mydemo2_3;
import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveDemo {
public static void main(String[] args) {
DatagramSocket ds=null;
DatagramPacket dp=null;
try { //UDP 接收端代码
ds=new DatagramSocket(8080);
while(true) {
byte[] buf=new byte[1024];
dp=new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String data=new String(dp.getData());
System.out.println(ip+port+data);
}
} catch(SocketException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
ds.close();
} catch(Exception e ) {
e.printStackTrace();
}
}
}
}
TCP协议传输机制:
原理是:先建立客户端的Socket服务,通过Socket对象里的in 和out完成读写的作用。当客户端和服务端连接后,服务端有了客户端的Socket对象,用Socket对象里的in 和out完成和它之间的数据传输。
具体方式:
建立客户端的Socket服务(传输ip和服务端的端口号),通过Socket对象里的getOutputStream() 方法,来写入数据,此时在服务端建立ServerSocket服务(传入端口号),然后调用accept()方法,返回Socket对象,此时用Socket对象中的getInputStream()方法来读取客户端传过来的数据并打印。
package mydemo2_3;
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) { //TCP客户端代码
Socket s = null;
BufferedReader br = null;
// BufferedWriter bw=null;
// BufferedReader br1=null;
try {
s = new Socket("192.168.2.100", 23477);
br = new BufferedReader(new InputStreamReader(System.in));
// bw=new BufferedWriter(new
// OutputStreamWriter(s.getOutputStream()));
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
BufferedReader br1 = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// OutputStream out=s.getOutputStream();
String line = null;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) {
break;
}
// bw.write(line);
// bw.newLine();
// bw.flush();
out.println(line);
String str = br1.readLine();
System.out.println("大写:" + str);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
s.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
package mydemo2_3;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
ServerSocket server=null;
BufferedReader br=null;
//BufferedWriter bw=null; //TCP服务端代码
try {
server=new ServerSocket(23477);
Socket s=server.accept();
br=new BufferedReader(new InputStreamReader(s.getInputStream()));
//bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line= null;
while((line=br.readLine())!=null) {
String str=line.toUpperCase();
// bw.write(str);
// bw.newLine();
// bw.flush();
out.println(str);
}
} catch(SocketException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
server.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}