Java网络编程-学习笔记

服务器:是指提供信息的计算机或程序

客户端:是指请求信息的计算机或程序

编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

使用java.net包中J2SE的API提供接口来解决问题,不用关注通信细节。

java.net 包中提供了两种常见的网络协议的支持:

  • TCP:传输控制协议,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

  • UDP:用户数据报协议,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

Socket 编程

Socket通常称作“套接字”,通常通过“套接字”向网络发出请求或者应答网络请求。

使用可Socket编程步骤:

1、服务器端创建ServerSocket对象,ServerSocket serverSocket = new ServerSocket(port);

2、调用accept方法返回Socket对象,Socket socket = serverSocket.accept();该方法将一直等待,直到客户端连接到服务器上给定的端口。

3、服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

客户端实例化Socket对象,通过端口请求连接到服务器 Socket s = new Socket(ip,port);

4、Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

5、在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,客户端、服务器端都使用Socket中的I/O流,进一步进行数据读写操作。

服务端

public class MyNetDemoServer1 {
	int port = 0;
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		MyNetDemoServer1 s1 = new MyNetDemoServer1();
		s1.server();

	}
	void server()
	{
		try {
			ServerSocket  ss = new ServerSocket (8888);
			while(true){
				Socket sks = ss.accept();
				System.out.println("已经接受到客户机:" + sks);
				System.out.println("已经接受到客户机:" + sks.getRemoteSocketAddress());
				
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

 

客户端

public class MyNetDemoClient1 {
	String ip = "";
	int port = 0;
	String words;
	public static void main(String args[]){
		MyNetDemoClient1 mc = new MyNetDemoClient1();
		mc.connection1(args);
		
	}
	void connection1(String args[]){
		if (args.length < 3) {
			System.out.println("请输入主机地址和端口号,话语");
			return ;
		}
		String ip1 = args[0];
		String port1 = args[1] ;
		words= args[2] ;
		ip = ip1 ;
		port = 	Integer.valueOf(port1) ;
		System.out.println(ip);
		System.out.println(port);
		
		
		//链接主机
		Socket sk ;
		try {
//			sk = new Socket("127.0.0.1",port);
			sk = new Socket(ip,port);
			System.out.println("已经链接主机:" + sk);
			OutputStream os = sk.getOutputStream();
			OutputStreamWriter ow = new OutputStreamWriter(os) ;
			ow.write(words + "\n");
			ow.flush();
			ow.close();
			sk.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}

 

 

 

实现多线程:

服务端:

public static void main(String[] args) {
		// TODO 自动生成的方法存根
		int port;// 定义服务器端口号
		ServerSocket ss;
		try {
			ss = new ServerSocket(8888);
			while (true) {
				Socket s = ss.accept();
				System.out.println("客户端已经连接");
				MyReadEXThread me = new MyReadEXThread();
				me.sks = s;
				Thread t1 = new Thread(me);
				t1.start();
			}
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}

客户端

public static void main(String[] args) {
		// TODO 自动生成的方法存根
		String ip;
		int port;
		if(args.length<2)
		{
			System.out.println("请输入主机ip和端口号");
			return ;
		}
		ip = args[0];
		port = Integer.valueOf((args[1]));
		try {
			Socket s = new Socket(ip,port);
			System.out.println("连接到主机");
			InputStream is =  s.getInputStream();
			FileOutputStream fs = new FileOutputStream("d:/EXnew_" +new Date().getTime()+".jpeg");
			byte buffer[] = new byte[128];
			
			while (true) {
				int c = is.read(buffer);
				if (c < 0) {
					break;
				}
				fs.write(buffer, 0, c);
			}
			is.close();
			fs.flush();
			fs.close();
			s.close();
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

MyReadEXThread

public class MyReadEXThread implements Runnable {

	Socket sks;

	@Override
	public void run() {
		// TODO 自动生成的方法存根
		OutputStream os;
		try {
			os = sks.getOutputStream();
			FileInputStream fi = new FileInputStream("d:/aaa.jpeg");
			byte buffer[] = new byte[128];
		
			while (true) {
				int c = fi.read(buffer);
				if (c < 0) {
					break;
				}
				os.write(buffer, 0, c);
			}
			os.flush();
			os.close();
			fi.close();
			sks.close();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}

	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃三明治的胖虎x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值