小白的网络编程入门:

java小白的网络编程入门:TCP通信

网络编程不等于网站编程,网络编程是为了实现计算机之间的信息传输和资源共享,而网站编程则是在实现了网络连接的基础上进行网站功能的实现和显示。
要进行网络编程首先要明确几个概念:IP地址、TCP协议、UDP协议。简单来说TCP是一种建立连接的可靠的通信,而UDP是一种单单发送封装的数据的不可靠的通信,这些概念网上讲的很清楚,在此就不赘述了。
在实现连接的时候有一个重要的类:Socket类

  • Socket通常用来实现Server-Client(服务器端-客户端)的连接,这个连接的一端即为一个Socket,可以理解为一个插口。
  • java.net包中有两个类SocketServerSocket,分别实现Client和Server端的连接
  • 建立连接时所需的地址信息为计算机的的IP地址和端口号(Port number)

下面就是根据代码学习啦:

Server端:

import java.net.*; 
import java.io.*;
public class TCPServer{
	public static void main(String args[]) throws Exception {
		ServerSocket ss = new ServerSocket(666);//见下

//首先,这里建立Server端的连接端口,通过666端口监听客户端的连接

		while(true){  //用while能接收多个客户端的连接
			Socket s = ss.accept();  

//accept方法用来接收一个连接,其返回值是Socket类型,是一种阻塞式的方法,如果没有接收到连接请求就会一直等着。

			System.out.println("a client is  connected!"); //显示连接成功
			DataInputStream dis = new DataInputStream(s.getInputStream()); 
			// 见下

//定义一个DataInputStream流,包装socket的getInputStream 方法上,这样可以直接读出一个String类型的数据(getInputStream方法可以得到这个接口的输入流)

  		System.out.println(dis.readUTF()); //read这个方法也是阻塞式的
  		dis.close();
  		s.close();
  	}
  }
}

Client端就类似了:

import java.net.*;
import java.io.*;
public class TCPClient{
	public static void main(String args[]) throws Exception{
		Socket s = new Socket("127.0.0.1",666); //见下

//建立Client端的连接端口:指定IP地址(127.0.0.1为本机地址)和要连接的端口号

		OutputStream  os = s.getOutputStream(); 
		DataOutputStream dos = new DataOutputStream(os);
		dos.writeUTF("Hello"+":"+s.getInetAddress()+" "+s.getPort()); 
			//getInetAddress方法和getPort方法得到服务器端的地址和端口号
		dos.flush();
		dos.close();
	}
}

注意点:

  • 运行的时候必须先启动server,再启动client
  • 必须要引入net包和io包

还有服务器端和客户端都可以说话的小程序:

Server端:

import java.net.*; 
import java.io.*;
public class TestServer{   //server端
	public static void main(String args[]){
		try{
			ServerSocket ss = new ServerSocket(666);  
				//指定接受端口666等待连接
			Socket s =ss.accept();  
				//接收一个连接 accept方法返回值socket类型 
					加上while(true)可以接收多个连接
			InputStream is = s.getInputStream();   
				//得到连接的输入流
			OutputStream os = s.getOutputStream();  
				//得到链接的输出流
			DataOutputStream dos = new DataOutputStream(os);  
			DataInputStream dis = new DataInputStream(is); 
				 //方便输入输出都包上上DataInputStream流
			dos.writeUTF("Hello!"+s.getInetAddress()+" "+s.getPort());  
				//得到服务器端的地址和端口号
			dos.flush();
			String string = null;
			if ((string = dis.readUTF())!=null){  //说一句读一句
				System.out.println(string);
				dis.close();
				is.close();
			}
			dos.close();
			os.close();  
				//注意!!!
				 当同时有输入有输出时,一定要完成输入输出后再关闭流,否则运行会有异常 
		}catch (IOException e){
			e.printStackTrace();
		}
	}
}

Client端

import java.io.*;
import java.net.*;
public class TestClient{
	public static void main(String args[]){
		 try{
			Socket s = new Socket("127.0.0.1",666);  
				//申请链接:指定IP地址(本机地址)和要连接的端口号
				//小错误:Socket s = so.accept();  client端不需要accept,是由client端申请链接
			OutputStream os =s.getOutputStream();
			DataOutputStream dos = new DataOutputStream(os);
			InputStream is =s.getInputStream();
			DataInputStream dis = new DataInputStream(is);
			String string = null;
			if ((string = dis.readUTF())!=null){
				System.out.println(string);
			}
				dos.writeUTF("hey");
				dos.flush();
				dos.close();
				os.close();
				dis.close();
				is.close()
		 }catch (UnknownHostException e){
			 e.printStackTrace();
		 }catch(IOException e){
			e.printStackTrace(); 
		}
	}
}

注意!!当同时有输入有输出时,一定要完成输入输出后再关闭流,否则编译没有异常运行会有异常

*这是跟着马士兵老师的视频学习后整理下来的,很喜欢这个老师讲课呢~
这是第一次在这里写我自己的博文,有错误或者不好的地方欢迎大神批评指正。◕ᴗ◕。
编辑器好多不会用,有没有人可以告诉我怎么首行缩进哇(灬°ω°灬) *

你可能感兴趣的:(小白的网络编程入门:)