java-网络编程-TCP

本文介绍了使用Java实现TCP客户端和服务端的交互过程,包括如何建立连接、发送和接收数据,以及多客户端并发上传图片到服务器端的实现。通过两个简单的例子展示了客户端发送数据和接收服务端响应的基本流程,以及服务端如何处理并发请求。

1,入门例子

package javaBase.net.tcp;
import java.io.*;
import java.net.*;

/*
 * 客户端client对应的对象是socket,
 * 在该对象建立时就能指定主机,tcp是面向连接的,所以在建立Socket服务时就要有服务端存在
 */
class TcpClient {
	public static void main(String[] args) throws Exception {
		//1,创建客户端socket服务,并指定服务器端主机和端口
		Socket s = new Socket("127.0.0.1",10003);
		//2,为了发送数据,拿到socket中的输出流并写数据
		OutputStream out = s.getOutputStream();
		out.write("tcp client send....".getBytes());
		//3,关闭socket
		s.close();
	}
}
/*
 * 服务端serversocket  自己不创建socket,从客户端获取其socket
 */
public class TcpServer {
	public static void main(String[] args) throws Exception{
		//1,创建服务端的socket服务,Serversocket();并监听一个端口
		ServerSocket ss = new ServerSocket(10003);
		//2,获取客户端传来的对象,accept(),阻塞方法,等待
		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();//获取客户端ip
		//3,用客户端对象的读取流获取客户端的数据
		InputStream in = s.getInputStream();
		byte [] buf = new byte[1024];
		int len = in.read(buf);
		String data = new String(buf,0,len);
		System.out.println(ip+": "+data );
		//4,关闭客户端
		s.close();
//		ss.close();//服务器一般都不关
	}
}

一次交互,客户端发送,服务端接收,再发送,客户端接收

package javaBase.net.tcp;
import java.io.*;
import java.net.*;

class TcpClient2 {
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1",10005);
		OutputStream out = s.getOutputStream();
		out.write("服务器,你好,我是客户端".getBytes());
		
		//读取服务端发的数据
		InputStream in  = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);//阻塞方法,等待服务端数据
		System.out.println("服务器说:"+new String(buf,0,len));
		s.close();
	}
}
public class TcpServer2 {
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10005);
		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println("客户端,你的IP是:"+ip);
		InputStream in = s.getInputStream();
		byte[] buf = new byte[1024];
		int len = in.read(buf);
		System.out.println("你刚才说:"+new String(buf,0,len)+"我睡4秒钟");
		Thread.sleep(4000);
		OutputStream out = s.getOutputStream();
		out.write("hello,我说这句话你听到没".getBytes());
		s.close();
		
	}
}

服务端开启服务:将客户端的每一行字符转成大写返回

package javaBase.net.tcp;
import java.io.*;
import java.net.*;

class TcpClient3 {
	public static void main(String[] args) throws Exception {
		Socket s = new Socket("127.0.0.1",10006);
		//键盘输入
		BufferedReader in =
				new BufferedReader(new InputStreamReader(System.in));
		//网络输出
		PrintWriter pw = 
				new PrintWriter(s.getOutputStream(),true);
		//网络输入
		BufferedReader bufIn = 
				new BufferedReader(new InputStreamReader(s.getInputStream()	));
		//循环获取键盘录入
		String line = null;
		while((line = in.readLine())!=null){
			if("over".equals(line))
				break;
			pw.println(line);//PrintWriter设为true,这里自动flush(),println()带回车符,write()不带
			
			//获取服务端返回的大写数据
			String str = bufIn.readLine();
			System.out.println("server:"+str);
		}
		in.close();//键盘录入不属于socket,自己关
		s.close();
		
	}
}
public class TcpServer3 {
	public static void main(String[] args) throws Exception {
		ServerSocket ss = new ServerSocket(10006);
		Socket s =  ss.accept();
		String ip = s.getInetAddress().getHostAddress();
		System.out.println(ip+"...connected");
		//读取客户端流
		BufferedReader in = 
				new BufferedReader(new InputStreamReader(s.getInputStream()));
		//返回给客户端流
		PrintWriter pw = 
				new PrintWriter(s.getOutputStream(),true);
		//读取客户端数据
		String line = null;
		while((line = in.readLine())!=null){
			pw.println(line.toUpperCase());
		}
		s.close();
//		ss.close();
		
	}
}

多客户端并发上传图片到服务器端

package javaBase.net.tcp;
import java.io.*;
import java.net.*;
/*
 * 客户端上传图片到服务器端
 */
class PicClient {
	public static void main(String[] args) throws Exception{
		Socket s= new Socket("127.0.0.1",10007);
		FileInputStream fin = new FileInputStream("man.jpg");
		OutputStream out = s.getOutputStream();
		//读写
		byte[] buf = new byte[1024];
		int len = 0;
		while((len = fin.read(buf))!=-1){
			out.write(buf,0,len);
		}
		s.shutdownOutput();
		//接收服务器端返回数据
		InputStream in = s.getInputStream();
		byte[] bufIn = new byte[1024];
		int num = in.read(bufIn);
		System.out.println(new String(bufIn,0,num));
		fin.close();
		s.close();
	}
}
/**
 * 服务器端并发上传图片
 * @author xukunn
 *	多线程
 */
class PicThread implements Runnable{
	private Socket s;
	public PicThread(Socket s) {
		this.s = s;
	}
	@Override
	public void run() {
		try {
			String ip = s.getInetAddress().getHostAddress();
			System.out.println(ip+"....connected");
			int count =1;
			File file = new File("man_server"+"("+count+")" +".jpg");
			while(file.exists()){
				file = new File("man_server"+"("+(count++)+")" +".jpg");
			}
			FileOutputStream fout = new FileOutputStream(file);
			InputStream in = s.getInputStream();
			byte[] buf = new byte[1024];
			int len = 0;
			while((len = in.read(buf))!=-1){
				fout.write(buf,0,len);
			}
			//回应客户端
			OutputStream out = s.getOutputStream();
			out.write("上传成功".getBytes());
			fout.close();
			s.close();
		} catch (Exception e) {
			throw new RuntimeException("上传失败");
		}
		
		
	}
}
/*
 * 这个服务端只能处理一个客户端的请求,另一个客户端只能等第一个客户端上传完成了,才会再次调用accept()方法
 * 所以服务端最好将每一个客户端封装到一个单独的线程中
 */
public class PicServer {
	public static void main(String[] args) throws Exception{
		ServerSocket ss = new ServerSocket(10007);
		while(true){
			Socket s = ss.accept();
			new Thread(new PicThread(s)).start();
			
		}
		
	}
}


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值