Java网络编程,我们先来看下面这一张图:
由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听。通过accept来判断是否有客户端与其相连。若成功连上,则通过readline和println函数来进行数据的发送和接收。实现网络编程。
示例如下:
服务器端代码:
/* * 功能:演示Java网络编程的服务器端 * author:ywq */ import java.io.*; import java.net.*; public class TestServer { InputStreamReader isr; BufferedReader br; PrintWriter pw; public static void main(String[] args) { TestServer ts=new TestServer(); } public TestServer() { try { //监听某个端口 ServerSocket ss=new ServerSocket(9999); System.out.println("我是socket服务器正在监听9999端口........."); //等待某个客户端来连接,accept()函数将返回一个socket连接 Socket s=ss.accept(); //要读取s中传递的数据 isr =new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); //通过readline()函数来读写数据 String info=br.readLine(); System.out.println("服务器收到的消息为:"+info); //我们通过pw向s写数据,true表示即时刷新 pw=new PrintWriter(s.getOutputStream(),true); pw.println("你也好,我是服务器!!!"); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
客户端代码:
/* * 功能:这是一个客户端,可以连接服务器端 * author:ywq */ import java.io.*; import java.net.*; public class TestClient { InputStreamReader isr; BufferedReader br; PrintWriter pw; public static void main(String[] args) { TestClient tc=new TestClient(); } public TestClient() { try { //socket()函数就是去连接某个服务器,ip+端口 Socket s=new Socket("127.0.0.1",9999); //如果s连接成功,就可以发送数据到服务器端 //我们通过pw向s写数据,true表示即时刷新 pw=new PrintWriter(s.getOutputStream(),true); pw.println("你好,我是客户端!!!"); //读取s中传递的数据 isr =new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); / /通过readline()函数来读写数据 String info=br.readLine(); System.out.println("客户端收到的消息为:"+info); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(pw!=null) pw.close(); if(br!=null) br.close(); if(isr!=null) isr.close(); } catch (IOException e) { e.printStackTrace(); } } } }
PrintWriter pw=new PrintWriter(s.getOutputStream(),true)其中true参数表示即时刷新。
通过InputStreamReader以及readline函数来实现数据的读取。
下边是一个半双工的示例:
服务器端代码:
/* * 功能:演示从控制台进行对话 * author:ywq */ import java.net.*; import java.io.*; public class TestServer { InputStreamReader isr,isr2; BufferedReader br,br2; PrintWriter pw; public static void main(String[] args) { // TODO Auto-generated method stub TestServer ts=new TestServer(); } public TestServer() { try { ServerSocket ss=new ServerSocket(3002); System.out.println("服务器在监听3002端口..."); //判断是否有客户端连接 Socket s=ss.accept(); //读取来自客户端的消息 isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); //接收从控制台输入的信息 isr2=new InputStreamReader(System.in); br2=new BufferedReader(isr2); while(true) { String respone=br.readLine(); if(respone.equals("再见")) { System.out.println("对话结束"); s.close(); break; } System.out.println("客户端说:"+respone); System.out.println("请输入要发送到客户端的信息:"); String info=br2.readLine(); //将消息发送给客户端 pw.println(info); if(info.equals("再见")) { System.out.println("对话结束"); s.close(); break; } } } catch (IOException e) { e.printStackTrace(); }finally { if(br2!=null) try { br2.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(isr2!=null) try { isr2.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(pw!=null) pw.close(); if(br!=null) try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(isr!=null) try { isr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
客户端代码如下:
/* * 功能:这是一个客户端,实现从控制台输入数据 * author:ywq */ import java.io.*; import java.net.*; public class TestClient { InputStreamReader isr,isr2; BufferedReader br,br2; PrintWriter pw; public static void main(String[] args) { // TODO Auto-generated method stub TestClient tc=new TestClient(); } public TestClient() { try { Socket s=new Socket("127.0.0.1",3002); pw=new PrintWriter(s.getOutputStream(),true); //从控制台接收消息 isr=new InputStreamReader(System.in); br=new BufferedReader(isr); //从服务器接收信息 isr2=new InputStreamReader(s.getInputStream()); br2=new BufferedReader(isr2); while(true) { System.out.println("请说出你想对服务器说的话,按回车键结束"); //得到从控制台输入的消息 String resp=br.readLine(); //将数据发送给服务器 pw.println(resp); if(resp.equals("再见")) { System.out.println("客户端使对话结束"); s.close(); break; } String respo=br2.readLine(); if(respo.equals("再见")) { System.out.println("服务器使对话结束"); s.close(); break; } System.out.println("服务器说:"+respo); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if(br2!=null) try { br2.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(isr2!=null) try { isr2.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(pw!=null) pw.close(); if(br!=null) try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(isr!=null) try { isr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
进一步学习:
下面看一个简易对讲机的实现:
服务器端代码:
/* * 功能:这是一个服务器,实现简易的对讲机,带界面 * author:ywq */ import javax.swing.*; import java.net.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; public class TestServer3 extends JFrame implements ActionListener{ //定义组件 JTextArea jta=null; JTextField jtf=null; JButton jb=null; JPanel jp=null; JScrollPane jsp=null; InputStreamReader isr=null; BufferedReader br=null; PrintWriter pw=null; public static void main(String[] args) { // TODO Auto-generated method stub TestServer3 ts=new TestServer3(); } public TestServer3() { //创建组件 jta=new JTextArea(); jtf=new JTextField(10); jb=new JButton("发送"); //设置监听 jb.addActionListener(this); jsp=new JScrollPane(jta); jp=new JPanel(); jp.add(jtf); jp.add(jb); this.add(jp,"South"); this.add(jsp,"Center"); this.setSize(300, 300); this.setVisible(true); this.setTitle("简易QQ聊天--服务器"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //建立socket连接 try { ServerSocket ss=new ServerSocket(1234); Socket s=ss.accept(); isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); //做一个循环 while(true) { //在循环中读取来自客户端的消息并且显示 String info=br.readLine(); jta.append("客户端说: "+info+"\r\n"); } } catch (IOException e) { e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { //进行相应的操作 if(e.getSource()==jb) { //点击发送按钮后,将消息发送出去 String resp=jtf.getText(); jta.append("你对客户端说: "+resp+"\r\n"); pw.println(resp); jtf.setText(" "); } } }
/* * 功能:这是一个客户端。可以实现简易对讲机 * author:ywq */ import javax.swing.*; import java.net.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; public class TestClient3 extends JFrame implements ActionListener{ //定义组件 JTextArea jta=null; JTextField jtf=null; JButton jb=null; JPanel jp=null; JScrollPane jsp=null; InputStreamReader isr=null; BufferedReader br=null; PrintWriter pw=null; public static void main(String[] args) { // TODO Auto-generated method stub TestClient3 tc=new TestClient3(); } public TestClient3() { //创建组件 jta=new JTextArea(); jtf=new JTextField(10); jb=new JButton("发送"); //设置监听 jb.addActionListener(this); jsp=new JScrollPane(jta); jp=new JPanel(); jp.add(jtf); jp.add(jb); this.add(jp,"South"); this.add(jsp,"Center"); this.setSize(300, 300); this.setVisible(true); this.setTitle("简易QQ聊天--客户端"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //建立socket连接 try { Socket s=new Socket("127.0.0.1",1234); isr=new InputStreamReader(s.getInputStream()); br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true); while(true) { //在循环中读取来自服务器的消息,并且显示 String info=br.readLine(); jta.append("服务器说: "+info+"\r\n"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void actionPerformed(ActionEvent e) { //点击发送按钮后,将消息发送出去 if(e.getSource()==jb) { String resp=jtf.getText(); jta.append("你对服务器说: "+resp+"\r\n"); pw.println(resp); //清空 jtf.setText(" "); } } }
由截图可以看出:本实例较好的实现了聊天功能。但是距离真的模拟QQ聊天技术还差很多。有待进一步改进。