1.UDP/TCP
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
java.net 包中 J2SE 的 API 包含有类和接口,它们提供低层次的通信细节。你可以直接使用这些类和接口,来专注于解决问题,而不用关注通信细节。
java.net 包中提供了两种常见的网络协议的支持:
-
TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。
-
UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
2.套接字(Socket)
DatagramSocket //用于UDP 通讯
Socket //用于TCP通讯的客户端
ServerSocket //用于TCP通讯的服务端
3.UDP
1)InetAddress 类 ,InetAddress 表示互联协义(IP)地址
2)发送端
1) 建立套接字 DatagramSocket socket=new DatagramSocket ();
2) 准备数据 DatagramPacket packet=new DatagramPacket (byte[],len,InetAddress,port);
3) 调用 套接字服务,进行发送 socket.send(packet);
4) 关闭资源 套接字 socket.close();
接收端
1) 建立套接字 DatagramSocket socket=new DatagramSocket ();
2) 准备 DatagramPacket 用来接收数据 DatagramPacket packet=new DatagramPacket (byte[],len);
3) 调用 套接字 提供的方法进行接收 socket.receive(packet);
4) 从DatagramPacket把接到的数据取出来 packet.getData;
5) 关闭资源 socket.close();
4.TCP
TCP服务端
1) 创建服务端的套接字ServerSocket ,指定在某个端口上监听 ServerSocket serverSocket=new ServerSocket(port);
2) 调用accpet() 方法得到客户端的套接字对象 serverSocket.accpet();
3) 从得到的套接字对象上,得到输入流,可以接收数据,得到输出流,发送数据serverSocket.accpet().getInputStream;
4) 关闭资源 serverSocket.close();
客户端
1) 建立套接字 Socket socket=new Socket(InetAddress, port);
2) 建一个输入流,接收键盘数据(用缓冲流) socket.getInputStream();
3) 得到输出流,把数据写入
4) 得到输入流,把变成大写的数据接收回来
5) 清理资源
5.实例
发送端
import java.net.*;
import java.io.*;
class TransClient
{
public static void main(String [] args) throws Exception
{
//建立套接字
Socket socket=new Socket("127.0.0.1", 8000);
//键盘输入流
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//建立通向服务端的输出流
BufferedWriter bw=new BufferedWriter( new OutputStreamWriter( socket.getOutputStream()));
//建立从服务端接收数据的输入流,接收变成大写之后的字符
BufferedReader brReslut=new BufferedReader(new InputStreamReader( socket.getInputStream()));
String msg=null;
while((msg=br.readLine())!=null)
{
bw.write(msg);
bw.newLine(); //不要忘
bw.flush(); //不要忘
//接收变成大写之后的字符串
System.out.println(brReslut.readLine());
}
socket.close();
br.close();
bw.close();
brReslut.close();
}
}
服务端
import java.net.*;
import java.io.*;
class TransServer
{
public static void main(String [] args) throws Exception
{
ServerSocket serverSocket=new ServerSocket(8000);
Socket clientSocket=serverSocket.accept(); //等待客户端连上来
BufferedReader br=new BufferedReader(new InputStreamReader( clientSocket.getInputStream())); //得到输入流,为了处理方便,包装成了缓冲流
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
//处理
String msg=null;
while((msg=br.readLine())!=null){
msg=msg.toUpperCase();
bw.write(msg);
bw.newLine(); //不要忘
bw.flush(); //不要忘
}
serverSocket.close();
clientSocket.close();
bw.close();
br.close();
}
}
//例子 图片上传
客户端
import java.io.*;
import java.net.*;
class ImgClient
{
public static void main(String [] args) throws Exception
{
Socket socket=new Socket("127.0.0.1",8800);
//文件输入流,代表要被上传的图片
InputStream in=new FileInputStream("c:/image/lengtu.jpg");
//得到通往服务端的输出流
OutputStream out =socket.getOutputStream();
byte[] buff= new byte[1024];
int len=0;
//开始传送
while((len=in.read(buff))!=-1){
out.write(buff,0,len);
}
socket.shutdownOutput(); //主动停止输入流,相当于在输入流中加一个结束标记
//接收服务端返回的信息
BufferedReader brResult= new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(brResult.readLine());
socket.close();
in.close();
brResult.close();
out.close();
}
}
服务端
import java.net.*;
import java.io.*;
class ImgServer {
public static void main(String [] atgs) throws Exception
{
ServerSocket serverSocket =new ServerSocket(8800);
Socket clientSocket=serverSocket.accept();
//建立一个输出流对象,表示传上来的文件要存放的位置
String senderIp=clientSocket.getInetAddress().getHostAddress();
OutputStream out=new FileOutputStream("c:/upload/"+senderIp+".jpg");
//取出客户端传上来的数据
InputStream in= clientSocket.getInputStream();
int len=0;
byte [] buff=new byte[1024];
//处理
while((len=in.read(buff))!=-1){
out.write(buff,0,len);
}
//告诉对方,传输成功
/* BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(clientSocket.getOutPutStream()));
bw.write("图片上传成功");
bw.newLine();
bw.flush(); */
PrintWriter pw=new PrintWriter(clientSocket.getOutputStream());
pw.println("图片上传成功");
pw.flush();
serverSocket.close();
clientSocket.close();
out.close();
in.close();
}
}