【java编程】tcp/udp——Socket网络编程部分

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类





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值