JAVA网络编程练习--基于TCP的java Socket通信过程--实现服务器与客户端的第一次通信

1、什么是TCP传输协议:

TCP(传输控制协议)_百度百科 (baidu.com)

2、什么是Socket:

socket是什么呀_百度知道 (baidu.com)

3、实现客户端与服务器的通信

(1)、控制台版

先看代码:

(注意:此代码可以直接复制粘贴但是需要将包名换成自己写的。)

编写服务器Socket:

package test08;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ServerSocket s = null;
		
		try 
		{
			
			s = new ServerSocket(6666);//创建端口
			
			Socket s1 = s.accept();
			
			System.out.println("this is a Server Window:");
			
			OutputStream os = s1.getOutputStream();
			
			DataOutputStream dos = new DataOutputStream(os);
			
			dos.writeUTF("Server : Hello,my name is Server!");
			
			InputStream is = s1.getInputStream();
			
			DataInputStream dis = new DataInputStream(is);
			
			System.out.println(dis.readUTF());
			
			dos.close();
			
			s1.close();
			
		}
		
		catch(IOException e)
		{
			
			e.printStackTrace();
			
		}
		
	}

}

编写客户端的Socket:

package test08;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try 
		{
			Socket s1 = new Socket("10.3.63.213",6666);
			
			System.out.println("this is a Client Window:");
			
			InputStream is  = s1.getInputStream();
			
			DataInputStream dis = new DataInputStream(is);
			
			OutputStream os = s1.getOutputStream();
			
			DataOutputStream dos = new DataOutputStream(os);
			
			dos.writeUTF("Client : Hello, my name is client");
			
			System.out.println(dis.readUTF());
			
			dis.close();
			
			s1.close();
			
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
		
	}

}

运行结果:

(注意:运行时要注意程序启动顺序,先运行服务器类,再运行客户端类。)

服务器类控制台输出显示:

客户端类控制台输出显示: 

 再看原理:

1、实现过程:

通过tcp协议和ServerSocket类我们能实现一个简单的客户端与服务器的通信过程,在服务器类与客户端类中有一段长相相同四句的代码:

            InputStream is  = s1.getInputStream();
			
			DataInputStream dis = new DataInputStream(is);
			
			OutputStream os = s1.getOutputStream();
			
			DataOutputStream dos = new DataOutputStream(os);

 他们就是连接服务器端与客户端的桥梁。

也就是说,客户端与服务器端是通过输入输出流进行相互连接的。

如图:

服务器的输出由客户端的输入接收到传递给客户端,客户端的输出再由服务器的输入接收到传递给服务器端。主要实现的方法就是getInputStream()和getOutputStream();其中DataOutputStream()和DataInputStream()是实现数据流通的方法。

而writeUTF()方法可以使输入的信息以UTF形式编码方式写入,readUTF()方法是使被输入的信息以UTF编码形式读出。

2、 客户端的套接字对象的实现:

try{Socket mysocket = new Scoket(“你的客户端的IP地址”,要连接的服务器端口名)};

catch(IOException e){ };

如果不知道在哪查看自己的IP地址的小伙伴可以采用以下方法:

1、点击桌面WiFi信号图标,选择已连接的网络,点击属性查看ipv4,把后面的一串数据输入就可以了。

 2、快捷键win+r打开运行窗口输入cmd,在输入ipconfig,点击回车找到ipv4输入即可。

 

3、服务器的套接字对象实现:

try{ServerSocekt server_socket = new ServerSocket(端口名);
}
catch(IOException e) { }

注意端口名不要使用0~1023间的数,他们是被预先定义的服务通信占用的,如telnet占用端口23,http占用80等。

try{Socket sc = new server_socket.accept();
}
catch(IOException e) { } 

以下是一个改进版本,加入一个while()循环 ,实现多对话聊天。

Server类: 

package test08;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		ServerSocket s = null;
		
		try 
		{
			
			s = new ServerSocket(8888);//创建服务器端口
			
			System.out.println("服务器窗口:");//在控制台输出端口名
			
			Socket s1 = s.accept();//等待接收
			
			OutputStream os = s1.getOutputStream();//创建输出流向客户端发送信息
			
			DataOutputStream dos = new DataOutputStream(os);//将数据输出给客户端
			
			InputStream is = s1.getInputStream();//创建输入流接收客户端发来的数据
			
			DataInputStream dis = new DataInputStream(is);//将客户端发来的数据传入服务器
			
			Scanner input = new Scanner(System.in);//控制台输入信息
			
			while(true)
			{
				
				String s2 = input.nextLine();//键盘输入指令
				
				dos.writeUTF(s2);//输出给客户端
				
			//		dos.flush();
				
				if(s2.equals("over")) break;
				
				System.out.println(dis.readUTF());
			}
			
			dos.close();
			
			s1.close();
			
		}catch(IOException e)
		{
			e.printStackTrace();
		}
		
	}

}

Client类:

package test08;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
		
			Socket s1 = new Socket("10.3.63.213",8888);//创建客户端,设置ip和服务器端口
			
			System.out.println("客户端窗口:");//给客户端命名
			
			InputStream is = s1.getInputStream();//创建输入流连接服务器服务器
			
			DataInputStream dis = new DataInputStream(is);//获得输入数据
			
			OutputStream os = s1.getOutputStream();//创建输出流连接服务器
			
			DataOutputStream dos = new DataOutputStream(os);//获得输出数据
			
			Scanner input = new Scanner(System.in);//引入键盘类
			
			while(true)
			{
				
				String s2 = input.nextLine();
				
				dos.writeUTF(s2);
				
				//	dos.flush();
				
				if(s2.equals("over")) break;
				
				System.out.println(dis.readUTF());
			}
			
			dos.close();
			
			s1.close();
			
		}catch(IOException e)
		{
			e.printStackTrace();
		}
	}

}

运行结果:

(此方法并不是很好,需要按回车才能显示收到的信息。)

 

 

Guess you like

Origin blog.csdn.net/qq_51701007/article/details/121231224