网络编程2

网络编程2

11.6.什么是TCP,它的优缺点是什么?

     TCP--传输控制协议[有连接的协议]

     优点:保证数据安全可靠

     缺点:消耗大,效率低

11.7.建立基于TCP的网络通讯程序需要使用的类和常用方法?

     基于TCP的网络通讯程序是区分客户端和服务器端

     创建客户端程序:

      1.java.net Class Socket 创建基于TCP的通讯程序的客户端对象的java类,通过这个类创建的对象就表示一个客户端

      2.构造方法

        Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指 定端口号。

        Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号。

      3.常用实例方法

OutputStream

getOutputStream() 返回此套接字的输出流。

InputStream

getInputStream() 返回此套接字的输入流。

void

close() 关闭此套接字。

     创建服务器端程序:

     1.java.net Class ServerSocket 创建基于TCP的通讯程序的服务器端对象的java类,通过这个类创建的对象就表示一个服务器端

     2.构造方法

       ServerSocket(int port) 创建绑定到指定端口的服务器套接字。

     3.实例方法

Socket

accept() 侦听要连接到此套接字并接受它。 【阻塞主线程运行】

void

close() 关闭此套接字。

     例如:完成客户端向服务器送数据,服务器接收到客户端发送来的数据。

              客户端向服务器送数据

package com.wangxing.test1;

import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 * 基于TCP的客户端【发送数据】
 * @author Administrator
 *
 */
public class TestClient1 {

	public static void main(String[] args) throws Exception{
		//定义服务器端的ip
		InetAddress  serverIP=InetAddress.getLocalHost();
		//定义服务器端的port
		int serverport=3000;
		//创建客户端对象
		Socket  client=new Socket(serverIP,serverport);
		//定义Scanner对象
		Scanner  input=new Scanner(System.in);
		System.out.println("请输入需要发送的数据:");
		String info=input.nextLine();
		//得到输出流
		OutputStream out=client.getOutputStream();
		//写出数据
		out.write(info.getBytes());
		//关闭流
		out.close();
		//关闭Socket
		client.close();
	}

}

       服务器接收到客户端发送来的数据:

package com.wangxing.test1;

import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基于TCP的服务器【接收数据】
 * @author Administrator
 *
 */
public class TestServer {

	public static void main(String[] args)throws Exception{
		//指定服务器开启的端口
		int serverport=3000;
		//创建服务器端对象
		ServerSocket  server1=new ServerSocket(serverport);
		System.out.println("服务器准备完毕,等待客户端连接.......");
		//等待客户端连接
		Socket  client1=server1.accept();
		//通过连接进入的客户端对象得到输入流,以接收客户端发送来的数据
		InputStream in=client1.getInputStream();
		//创建保存发送来的数据用的字节数组
		byte  data[]=new byte[1024];
		//读取客户端发送来的数据
		int len=in.read(data);
		//将保存在字节数组中的数据转换成String
		String  msg=new String(data,0,len);
		System.out.println("接收的数据是:"+msg);
		//关闭流
		in.close();
		//关闭Socket
		client1.close();
		//关闭服务器
		server1.close();
	}

}

     例如2:完成客户端持续向服务器送数据,服务器持续接收到客户端发送来的数据。

                  客户端持续向服务器送数据:

package com.wangxing.test2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//客户端
public class TcpClient1 {
	public static void main(String[] args) throws Exception{
		//定义保存服务器端ip地址的对象
		//String serverip="";
		InetAddress  serverip=null;
		//定义保存服务器端端口号的变量
		int serverport=3000;
		//定义连接服务器的客户端对象
		Socket client=null;
		//定义接收控制台信息的输入流
		BufferedReader inputinfo=null;
		//定义保存被发送数据的字符串变量
		String info=null;
		//定义发送数据的输出流对象
		OutputStream  out=null;
		//定义控制持续发送数据的boolean变量
		boolean  flag=true;
		//实例化保存服务器ip地址的对象
		serverip=InetAddress.getLocalHost();
		//实例化客户端对象,连接到服务器
		client=new Socket(serverip,serverport);
		//实例化接收控制台信息的输入流
		inputinfo=new BufferedReader(new InputStreamReader(System.in));
		//创建发送数据的输出流对象
		out=client.getOutputStream();
		//持续发送数据
		while(flag) {
		//提醒用户请输入被发送的信息
		System.out.println("请输入被发送的信息:");
		//接收被发送的信息
		info=inputinfo.readLine();
		//将被发送的数据写出
		out.write(info.getBytes());
		//判断退出客户端
		if(info.equals("886")) {
			flag=false;
		}
		}
		//关闭流和客户端
		out.close();
		inputinfo.close();
		client.close();
	}
}

       服务器持续接收到客户端发送来的数据:

package com.wangxing.test2;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer1 {
	public static void main(String[] args)throws Exception {
		//定义服务器需要开发的端口号
		int prot=3000;
		//定义服务器端对象
		ServerSocket  server=null;
		//定义保存连接到服务器的客户端对象
		Socket client=null;
		//定义读取客户端发送来的数据的输入流对象
		InputStream in=null;
		//定义保存客户端发送来的数据的字符串变量
		String msg=null;
		//定义保存控制持续接收数据的boolena变量
		boolean flag=true;
		//实例化服务器对象
		server=new ServerSocket(prot);
		System.out.println("服务器已经开启,等待客户端连接......");
		//服务器得到连接进来的客户端对象
		client=server.accept();
		//实例化读取客户端发送来的数据的输入流对象
		in=client.getInputStream();
		//控制持续接收数据
		while(flag) {
		//读取客户端信息
		byte data[]=new byte[100];
		int len=in.read(data);
		//将读取到字节数组中的数据转换成字符串
		msg=new String(data,0,len);
		System.out.println("服务收到来之客户端的信息=="+msg);
		//判断关闭服务器
		if(msg.equals("886")) {
			flag=false;
		}
		}
		//关闭流和客户端以及服务器
		in.close();
		client.close();
		server.close();
	}
}

     例如3:完成客户端持续向服务器送数据,还能接收服务器返回的信息,服务器持续接收到客户端发送来的数据,还可以向客户端返回信息。

                  客户端持续向服务器送数据,还能接收服务器返回的信息:

package com.wangxing.test3;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//客户端
public class TcpClient1 {
	public static void main(String[] args) throws Exception{
		//定义保存服务器端ip地址的对象
		//String serverip="";
		InetAddress  serverip=null;
		//定义保存服务器端端口号的变量
		int serverport=3000;
		//定义连接服务器的客户端对象
		Socket client=null;
		//定义接收控制台信息的输入流
		BufferedReader inputinfo=null;
		//定义保存被发送数据的字符串变量
		String info=null;
		//定义发送数据的输出流对象
		OutputStream  out=null;
		//定义接收服务器返回信息的输入流对象
		InputStream  in=null;
		//定义保存接收数据的字符串变量
		String msg=null;
		//定义控制持续发送数据的boolean变量
		boolean  flag=true;
		//实例化保存服务器ip地址的对象
		serverip=InetAddress.getLocalHost();
		//实例化客户端对象,连接到服务器
		client=new Socket(serverip,serverport);
		//实例化接收控制台信息的输入流
		inputinfo=new BufferedReader(new InputStreamReader(System.in));
		//创建发送数据的输出流对象
		out=client.getOutputStream();
		//创建接收数据的输入流对象
		in=client.getInputStream();
		//持续发送数据
		while(flag) {
		//提醒用户请输入被发送的信息
		System.out.println("请输入被发送的信息:");
		//接收被发送的信息
		info=inputinfo.readLine();
		//将被发送的数据写出
		out.write(info.getBytes());
		//判断退出客户端
		if(info.equals("886")) {
			flag=false;
		}
		//客户端接收服务器返回的信息
		byte  data[]=new byte[100];
		int len=in.read(data);
		msg=new String(data,0,len);
		System.out.println("客户端接收到的服务器返回的数据是=="+msg);
		}
		//关闭流和客户端
		in.close();
		out.close();
		inputinfo.close();
		client.close();
	}
}

      服务器持续接收到客户端发送来的数据,还可以向客户端返回信息:

package com.wangxing.test3;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer1 {
	public static void main(String[] args)throws Exception {
		//定义服务器需要开发的端口号
		int prot=3000;
		//定义服务器端对象
		ServerSocket  server=null;
		//定义保存连接到服务器的客户端对象
		Socket client=null;
		//定义读取客户端发送来的数据的输入流对象
		InputStream in=null;
		//定义返回给客户端发的数据的输出流对象
		OutputStream out=null;
		//定义保存客户端发送来的数据的字符串变量
		String msg=null;
		//定义保存控制持续接收数据的boolena变量
		boolean flag=true;
		//实例化服务器对象
		server=new ServerSocket(prot);
		System.out.println("服务器已经开启,等待客户端连接......");
		//服务器得到连接进来的客户端对象
		client=server.accept();
		//实例化读取客户端发送来的数据的输入流对象
		in=client.getInputStream();
		//实例化返回给客户端发的数据的输出流对象
		out=client.getOutputStream();
		//控制持续接收数据
		while(flag) {
		//读取客户端信息
		byte data[]=new byte[100];
		int len=in.read(data);
		//将读取到字节数组中的数据转换成字符串
		msg=new String(data,0,len);
		System.out.println("服务收到来之客户端的信息=="+msg);
		//判断关闭服务器
		if(msg.equals("886")) {
			flag=false;
		}
		if(msg.equals("吃了吗?")) {
			//返回信息给客户端
			msg="吃了!";
			out.write(msg.getBytes());
		}else if(msg.equals("吃的什么?")) {
			//返回信息给客户端
			msg="油泼面!";
			out.write(msg.getBytes());
		}else {
			msg="不知道!";
			out.write(msg.getBytes());
		}
		}
		//关闭流和客户端以及服务器
		out.close();
		in.close();
		client.close();
		server.close();
	}
}

     例5:多客户端,配置一台服务器,独立运行:

package com.wangxing.test4;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//客户端
public class TcpClient1 {
	public static void main(String[] args) throws Exception{
		//定义保存服务器端ip地址的对象
		//String serverip="";
		InetAddress  serverip=null;
		//定义保存服务器端端口号的变量
		int serverport=3000;
		//定义连接服务器的客户端对象
		Socket client=null;
		//定义接收控制台信息的输入流
		BufferedReader inputinfo=null;
		//定义保存被发送数据的字符串变量
		String info=null;
		//定义发送数据的输出流对象
		OutputStream  out=null;
		//定义接收服务器返回信息的输入流对象
		InputStream  in=null;
		//定义保存接收数据的字符串变量
		String msg=null;
		//定义控制持续发送数据的boolean变量
		boolean  flag=true;
		//实例化保存服务器ip地址的对象
		serverip=InetAddress.getLocalHost();
		//实例化客户端对象,连接到服务器
		client=new Socket(serverip,serverport);
		//实例化接收控制台信息的输入流
		inputinfo=new BufferedReader(new InputStreamReader(System.in));
		//创建发送数据的输出流对象
		out=client.getOutputStream();
		//创建接收数据的输入流对象
		in=client.getInputStream();
		//持续发送数据
		while(flag) {
		//提醒用户请输入被发送的信息
		System.out.println("请输入被发送的信息:");
		//接收被发送的信息
		info=inputinfo.readLine();
		//将被发送的数据写出
		out.write(info.getBytes());
		//判断退出客户端
		if(info.equals("886")) {
			flag=false;
		}
		//客户端接收服务器返回的信息
		byte  data[]=new byte[100];
		int len=in.read(data);
		msg=new String(data,0,len);
		System.out.println("客户端接收到的服务器返回的数据是=="+msg);
		}
		//关闭流和客户端
		in.close();
		out.close();
		inputinfo.close();
		client.close();
	}
}
//服务器为连接到服务器的每一个客户端构造的线程类
package com.wangxing.test4;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class ServerThread extends Thread{
	//定义保存连接到服务器的客户端对象
	private Socket client=null;
	//定义读取客户端发送来的数据的输入流对象
	private InputStream in=null;
	//定义返回给客户端发的数据的输出流对象
	private OutputStream out=null;
	//定义保存客户端发送来的数据的字符串变量
	private String msg=null;
	//定义保存控制持续收发信息的boolena变量
	private boolean flag=true;
	
	public ServerThread(Socket client) {
		this.client=client;
	}
	
	@Override
	public void run() {
		try {
		//实例化读取客户端发送来的数据的输入流对象
		in=client.getInputStream();
		//实例化返回给客户端发的数据的输出流对象
		out=client.getOutputStream();
		//控制持续接收数据
		while(flag) {
		//读取客户端信息
		byte data[]=new byte[100];
		int len=in.read(data);
		//将读取到字节数组中的数据转换成字符串
		msg=new String(data,0,len);
		System.out.println("服务收到来之客户端的信息=="+msg);
		//判断关闭服务器
		if(msg.equals("886")) {
			flag=false;
		}
		if(msg.equals("吃了吗?")) {
			//返回信息给客户端
			msg="吃了!";
			out.write(msg.getBytes());
		}else if(msg.equals("吃的什么?")) {
			//返回信息给客户端
			msg="油泼面!";
			out.write(msg.getBytes());
		}else {
			msg="不知道!";
			out.write(msg.getBytes());
		}
	  }
		//关闭流和客户端以及服务器
		out.close();
		in.close();
		client.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}
//服务器主程序
package com.wangxing.test4;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer1 {
	public static void main(String[] args)throws Exception {
		//定义服务器需要开发的端口号
		int prot=3000;
		//定义服务器端对象
		ServerSocket  server=null;
		//定义保存连接到服务器的客户端对象
		Socket client=null;
		//定义保存控制持续接收连接到服务器的客户端对象的boolena变量
		boolean flag=true;
		//实例化服务器对象
		server=new ServerSocket(prot);
		System.out.println("服务器已经开启,等待客户端连接......");
		//持续接收连接到服务的客户端对象
		while(flag) {
		//服务器得到连接进来的客户端对象
		client=server.accept();
		//为连接到服务器的客户端开启一条线程
		new ServerThread(client).start();
		}
		server.close();
	}
}

总结:

客户端程序的开发步骤:

  1. 创建客户端对象【Socket】,连接服务器
  2. 通过客户端对象【Socket】的getInputStream() / getOutputStream(),得到输入输出流
  3. 通过得到的输入输出流对象调用read()/write()方法完成数据收发。
  4. 关闭输入输出流和客户端对象【Socket】。

服务器程序的开发步骤:

  1. 创建服务器端对象【ServerSocket】,开启服务器
  2. 通过服务器端对象【ServerSocket】的accept()方法,获得连接进入服务器的客户端对象【Socket】
  3. 连接进入服务器的客户端对象【Socket】的getInputStream() / getOutputStream(),得到输入输出流.
  4. 通过得到的输入输出流对象调用read()/write()方法完成数据收发。
  5. 关闭输入输出流和客户端对象【Socket】以及服务器端对象【ServerSocket】。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值