1.什么是网络编程
网络编程其实就是实现两个计算机的数据交换(交互)。
可以通过直接或间接的通过网络协议与其他的计算机进行通讯。(HTTP协议,TCP/IP协议等)
2.Tcp网络编程的实现流程
主要分为服务器端(Server)和客户端(Client)。
通过这个图我们其实就可以了解了实现服务器和客户机交互过程是怎么样的了。
实现这些原理最重要的是Socket类也叫做套接字。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
服务器端
1.首先创建ServerSocket对象并且设置与外界通讯的端口号,这样就建立了一个可以供其它计算机访问的端口了(这里端口号是可以随便取得但是是在1024~65535之间,因为0~1023被预先通讯的服务占用(比如http占用80端口,telnet占用了23端口等))。
ServerSocket servesocket = new ServerSocket(2222);
2.然后调用accept()方法,监听连接请求,如果客户端请求连接,则接受链接,并且返回通信套接字(Socket)。
Socket socket = serversocket.accept()
3.获取输入输出流
获取socket的输入流
BufferedReader br = new BufferedReader(new getInputSteamReader(socket.getInputStream()))
获取socket的输出流
PrintWriter out = new PerintWriter(socket.getOutputStream())
4.最后就是关闭Scoket
socket.close()
客户端
1.创建socket对象,并实现socket的有参构造方法,输入ip地址和端口号 (这里的address就是IP地址,port就是端口号)
Socket socket = new Socket(InetAddress address,int port)
2.获取Socket的输入输出流
获取socket的输入流
BufferedReader br = new BufferedReader(new getInputSteamReader(socket.getInputStream()))
获取socket的输出流
PrintWriter out = new PerintWriter(socket.getOutputStream())
3.关闭Socket
socket.close()
上面就是实现服务器端和客户端交互的主要流程下面我们来看一下具体实例:
服务器端
1 public static voidServer(){2 try{3 //创建ServerSocket对象并且定义连接端口
4 ServerSocket serversocket = new ServerSocket(2222);5 //实现连接监听
6 Socket socket =serversocket.accept();7 //获取socket输出流
8 BufferedReader br = new BufferedReader(newInputStreamReader(socket.getInputStream()));9 //获取socket输入流
10 PrintWriter out = newPrintWriter(socket.getOutputStream());11 //通过输出流获取客户端传来的信息
12 String str=br.readLine();13 //输出信息
14 System.out.println(str);15
16 //通过输入流向客户端发送信息
17 out.write("成功收到客户端传递的信息");18 //刷新写入
19 out.flush();20
21 //关闭输出流
22 br.close();23 //关闭输入流
24 out.close();25 //关闭serversocket
26 serversocket.close();27 } catch(IOException e) {28 //TODO Auto-generated catch block
29 e.printStackTrace();30 }31 }32
33 public static voidmain(String[] args) {34 Server();35 }
客户端
1 public static voidClien(){2 try{3 //创建socket对象并写入ip地址和端口号(这里是可以通过手动写入的,我这里写的是最简单的之交互一次的例子)
4 Socket socket = new Socket("192.168.0.102",2222);5 //获取输入流
6 PrintWriter out = newPrintWriter(socket.getOutputStream());7 BufferedReader br = new BufferedReader(newInputStreamReader(socket.getInputStream()));8 //读取从控制台输入的信息
9 BufferedReader in = new BufferedReader(newInputStreamReader(System.in));10 //获取控制台输入的信息
11 String str=in.readLine();12 //将控制台中的信息写入
13 out.write(str);14 //刷新写入
15 out.flush();16 //关闭输入流(这里用shutdown是只关闭输入流这一个流,如果不关闭则会无限次写,客户端和服务端卡死,无法进行下一步动作)17 //如果是用out.close();是会把socket这个对象的流给关闭,等到下面需要读取客户端信息的时候就会显示socket closed的错误。
18 socket.shutdownOutput();19
20 //获取服务器端传来的信息
21 String serverstr=br.readLine();22 System.out.println(serverstr);23 //关闭
24 br.close();25 socket.close();26 } catch(UnknownHostException e) {27 //TODO Auto-generated catch block
28 e.printStackTrace();29 } catch(IOException e) {30 //TODO Auto-generated catch block
31 e.printStackTrace();32 }33 }34
35 public static voidmain(String[] args) {36 Clien();37 }
我这里写的只是服务器和客户机的一次交互的最简单的操作。
如果想要实现一直在交互,直到输入某个字符后退出交互,可以使用循环。
1 while(true){2 String str =br.readLine();3 System.out.println(str);4
5 out.write("成功收到客户端传递的信息");6 out.flush();7 if(str.equals("end")){8 break
9 }10 }
上面是服务器端的循环交互的代码。客户端差不多,我就不写了
最后总结一下:实现交互的流程
1.创建socket对象(服务端创建Serversocket对象,并且监听)
2.获取输入输出流
3.关闭
其实主要就是这三点,如果想进行更复杂的交互,则可以在输入输出中继续添加即可