《Java从入门到放弃》JavaSE入门篇:网络编程(入门版)
要进行网络编程,首先要搞清楚目的是什么。
网络编程说简单点就是在网络上的计算机进行数据的交互。
既然要进行数据交互,那就需要有一个发送方和一个接受方。
当然,现阶段网上的电脑一般来说都是既接受数据,也能发送数据的,所以说这些电脑都是“插座型”的,进可攻,退可受!!!
好吧,还是使用专业点的名字吧:客户端/服务器。
那么具体到两台电脑,它们是如何来交互数据的呢?请看下图:
从步骤来分析:
一、服务器端程序
1.1创建一个服务器套接字(ServerSocket),并绑定到指定端口。
1.2侦听来自客户端的请求,如果接受到连接则返回套接字对象(socket)。
1.3获得输入/输出流,也就是进行数据的接收或发送。
1.4关闭套接字(socket)。
二、客户端程序
2.1创建一个套接字,向服务器指定商品发送请求。
2.2与服务器正确连接后开始数据的接收或发送。
2.3关闭套接字。
步骤分析完了,接下来就是实施了。
服务器端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
public class MyServer { private static final int SERVER_PORT = 9527 ; // 指定侦听端口 public MyServer() { try { ServerSocket ss = new ServerSocket(SERVER_PORT); // 创建服务器套接字 System.out.println( "服务端已启动,正在等待客户端..." ); Socket s = ss.accept(); // 侦听来自客户端的请求 InputStream in = s.getInputStream(); // 获得输入流,用来接收数据 OutputStream out = s.getOutputStream(); // 获得输出流,用来发送数据 byte [] buf = new byte [ 1024 ]; // 数据缓存 int len = in.read(buf); // 从输入流中读取数据 String strFromClient = new String(buf, 0 , len); System.out.print( "来自客户端的信息>>" ); System.out.println(strFromClient); String strToClient = "我也很好!" ; out.write(strToClient.getBytes()); // 往输出流中发送数据 // 关闭输入流和输出流 in.close(); out.close(); // 关闭通信套接字和服务器套接字 s.close(); ss.close(); System.out.println( "服务端已关闭。" ); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { MyServer ms = new MyServer(); } } |
客户端代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public class MyClient { private static final int SERVER_PORT = 9527 ; //服务器的侦听端口 public MyClient() { try { //由于服务端也是运行在本机,所以创建本机的InetAddress对象 InetAddress address = InetAddress.getByName( "localhost" ); Socket s = new Socket(address, SERVER_PORT); //向服务器侦听端口发出请求 System.out.println( "客户端已启动。" ); InputStream in = s.getInputStream(); //获得输入流,用来接收数据 OutputStream out = s.getOutputStream(); //获得输出流,用来发送数据 String strToServer = "你好!" ; out.write(strToServer.getBytes()); //往输出流中发送数据 byte [] buf = new byte [ 1024 ]; int len = in.read(buf); //从输入流中读取数据 String strFromServer = new String(buf, 0 , len); System.out.print( "来自服务端的回答>>" ); System.out.println(strFromServer); in.close();out.close(); //关闭输入流和输出流 s.close(); //关闭通信套接字 System.out.println( "客户端已关闭。" ); } catch (UnknownHostException nhe) { System.out.println( "未找到指定主机..." ); } catch (IOException ioe) { ioe.printStackTrace(); } } public static void main(String[] args) { MyClient mc = new MyClient(); } } |
先运行服务器端
再运行客户端,可以发现服务器端的内容发生了变化
再切换到客户端的输出窗口
客户端的输出内容如下:
有兴趣的看官可以修改代码,让它变成可以从控制台反复输入文字来交互。研究得更深些的朋友,可以尝试发送文件。
“软件思维”博客地址:51CTO,博客园,感兴趣的小伙伴可以去看相关的其它博文。
不努力一把,你怎么知道自己有多么废呢,啊哈哈哈哈!