TCP——Socket网络编程部分:
特点:1.tcp是面向连接的,连接时需要三次握手
2.tcp适合传输大数据
3.tcp能保证数据的完整性,传输速度稍慢
构成:1.分为客户端和服务器端
2.客户端建立Socket服务,服务端直接使用客户端建立的Socket服务来完成数据的传输
接下来我们就来用一张图来说明,客户端和服务端的关系吧!
客户端配置的一般思路:
1.建立客户端Socket服务,并指定服务器的主机ip地址和端口号
2.如果是上传文件,要先建立相应的读取流
3.得到Socket服务的OutputStream输出流,向服务器上传文件
4.上传完毕后,设置一个标识,让服务器的读取流停下来,一般用socket服务的shutdownOutput方法
5.得到Socket服务的InputStream输入流,得到服务器返回来的信息
6.关闭资源
服务端配置的一般思路:
1.建立服务端Socket服务,指定端口号
2.得到客户端Socket服务
3.建立输出流,用于保存文件
4.得到客户端socket服务字节输入流
5.得到客户端Socket服务字节输出流
6.关闭资源
案例:1.多个用户同时上传图片到服务器上,服务器会返回上传成功
特点:1.一般的图片字节流输入输出
2.设置结束标识
3.为每个用户创建一个线程
4.文件的命名方式
import java.io.*;
import java.net.*;
class PicClient //客户端
{
public static void main(String[] args)
{
if(args.length!=1)
{
System.out.println("请选择一个jpg格式的图片");
return;
}
File file=new File(args[0]);
if(!(file.exists() && file.isFile()))
{
System.out.println("该文件有问题,要么不存在,要么不是文件");
return;
}
if(!file.getName().endsWith("jpg"))
{
System.out.println("文件不是jpg文件");
return;
}
try
{
//建立Socket服务,指定主机地址和端口号
Socket s=new Socket("127.0.0.1",8800);
//建立字节读取流,读取图片
FileInputStream in = new FileInputStream(file);
//得到Socket服务输出流,上传图片
OutputStream out = s.getOutputStream();
//建立缓冲区
byte[] buf=new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
//System.out.println("a");
out.write(buf,0,len);
}
//设置标识符,标记图片已被读取完毕
s.shutdownOutput();
//得到Socket服务输入流,获取服务器传过来的信息
InputStream buIn = s.getInputStream();
byte[] bufIn=new byte[1024];
int num = buIn.read(bufIn);
System.out.println(new String(bufIn,0,num));
in.close();
s.close();
}
catch (IOException e)
{
throw new RuntimeException("操作失败!");
}
}
}
class PicThread implements Runnable //多线程,让每个用户获得一个线程
{
private Socket s;
PicThread(Socket s)
{
this.s=s;
}
public void run()
{
int count=1;
String ip=s.getInetAddress().getHostAddress();
try
{
System.out.println(ip+".......connection");
//创建文件对象,定义文件格式
File file = new File(ip + "("+(count)+")"+".jpg");
while(file.exists())
file=new File(ip + "("+(count++)+")"+".jpg");
//得到Socket服务输入流
InputStream in = s.getInputStream();
//建立字节输出流,保存图片
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[1024];
int len=0;
while((len=in.read(buf))!=-1)
{
fos.write(buf,0,len);
}
//得到Socket服务输出流
OutputStream out = s.getOutputStream();
out.write("上传成功!".getBytes());
fos.close();
}
catch (IOException e)
{
throw new RuntimeException("操作失败");
}
}
}
class PicServer //服务器端
{
public static void main(String[] args)
{
try
{
//建立serverSocket服务
ServerSocket ss=new ServerSocket(8800);
while(true)
{
//得到客户端socket服务
Socket s = ss.accept();
//为用户分配线程
new Thread(new PicThread(s)).start();
}
}
catch (IOException e)
{
throw new RuntimeException("操作失败!");
}
}
}
案例2:上传纯文本到服务器,服务器返回上传成功
特点:1.用字符缓冲区来处理纯文本
2.设置结束标识
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
class TextClient //客户端
{
public static void Main(String[] args) throws UnknownHostException, IOException
{
//创建Socket服务
Socket s = new Socket("127.0.0.1",8802);
//创建输入流
BufferedReader bufr = new BufferedReader(new FileReader("G:\\JavaCode\\transfer.java"));
//创建输出打印流(和BufferedWriter相似)
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufr.readLine())!=null)
{
out.println(line);
}
//添加文件结束标记
s.shutdownOutput();
//创建输入流与Socket绑定
BufferedReader bufw = new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = bufw.readLine();
System.out.println(data);
}
}
class TextServer //服务器端
{
public static void Main(String[] args) throws IOException
{
//创建ServerSocket服务
ServerSocket ss = new ServerSocket(8802);
//得到客户端Socket服务
Socket s = ss.accept();
//创建输入流与Socket绑定
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
//创建打印输出流,将读到的数据写到文件中
PrintWriter out = new PrintWriter(new FileWriter("G:\\server.txt"),true);
String line=null;
while((line=bufIn.readLine())!=null)
{
out.println(line);
}
//创建输出流与Socket绑定
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("上传成功!");
}
}
-----------------------------------------------------------------------------------------------------------------------------------------
UDP——Socket网络编程部分:
特点:1.udp是面向无连接的,数据包的大小限制在64K内
2.udp是不安全的连接,会产生丢包
3.速度稍快,适合对数据完整性要求不严格的数据传输
构成:1.服务器和客户端分别对应不同的DatagramSocket服务
2.获取信息都要用到DatagramPacket类