一、控制台版本无线循环聊天(服务器&客户端)
服务端:
package com.zking.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; /** * TCP传输协议中服务器端 * * @author Administrator * */ public class ServerTest { public static void main(String[] args) throws Exception { System.out.println("---------------服务器端---------------------"); // 1.使用ServerSocket来开启一个服务器 ServerSocket ss = new ServerSocket(7979); System.out.println("服务器开启成功,等待客户端链接....."); // 2.接收指定的客户端 Socket sk = ss.accept(); System.out.println("某客户端已链接成功服务器"); // 接收客户端发送的消息 InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); // 回复消息给客户端去 OutputStream os = sk.getOutputStream(); OutputStreamWriter oos = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(oos); // 写 Scanner sc = new Scanner(System.in); while (true) { // 读取 String readLine = br.readLine(); System.out.println("客户端说: " + readLine); if("bye".equalsIgnoreCase(readLine)) { System.out.println("我也下线"); break; } System.out.println("我是服务器,请输入您要发送给客户端的内容: "); String str = sc.next(); bw.write(str); bw.newLine();// 跨行 bw.flush();// 刷新缓冲区 } } }
客户端:
package com.zking.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; /** * 客户端 * * @author Administrator * */ public class ClientTest { public static void main(String[] args) throws Exception { System.out.println("---------------客户端--------------"); // 1.利用套接字Socket来实现链接指定的服务器 Socket sk = new Socket("127.0.0.1", 7979); System.out.println("客户端开启,成功连上服务器"); // 需求:有客户端先发送消息给服务器端 /** * 利用套接字Socket获取输出流方可发送消息到服务器段 */ OutputStream os = sk.getOutputStream(); OutputStreamWriter oos = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(oos); // 客户端接受服务器端回复的消息 InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); // 写 Scanner sc = new Scanner(System.in); while (true) { System.out.println("我是客户端,请输入您要发送给服务器端的内容: "); String str = sc.next(); bw.write(str); bw.newLine();// 跨行 bw.flush();// 刷新缓冲区 //equalsIgnoreCase 比较2个字符串是否相同 不区分大小写 if("bye".equalsIgnoreCase(str)) { System.out.println("bybye,下线了。"); break; } // 读取 String readLine = br.readLine(); System.out.println("服务器说说: " + readLine); } //关闭所有流 br.close(); isr.close(); is.close(); bw.close(); oos.close(); os.close(); sk.close(); } }
二、控制台版本:文件下载器
文件的下载是指客户端从服务器端下载一个文件到客户端;
比如LOL的客户端,是要去LOL的官方服务器上把客户端的安装包下载到本地后再安装。
-------------【总思路】--------------
1.启动服务器并且等待客户端上线
2.客户端连接服务器
3.客户端告知服务器要下载的文件名
4.服务器接收文件名并在本地找到对应文件
5.服务器将该文件从硬盘读到内存中,再写入网络中
6.客户端从网络上下载该文件,并保存到本地
7.关闭连接服务端:
package com.zking.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; /** * 手机应用市场APP服务器端 * @author Administrator * */ public class FileServerTest { public static void main(String[] args) throws Exception{ System.out.println("-------------------手机应用市场APP服务端----------------"); //开启服务器 ServerSocket ss = new ServerSocket(9999); System.out.println("服务器已开启"); Socket sk = ss.accept(); System.out.println("\t\t客户端上线了"); //接受客户端发送过来的程序的链接 InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); //读取 String path = br.readLine();//程序的路径 //利用发送过来的文件(程序)的路径拿到程序 File file = new File(path); FileInputStream fis = new FileInputStream(file); BufferedInputStream bis = new BufferedInputStream(fis); //利用socket套接字将输出流获取 OutputStream os = sk.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(os); System.out.println("文件的内容: "); int len = 0; while(-1!=(len = bis.read())) { // System.out.print((char)len); bos.write(len); bos.flush(); } bos.close(); os.close(); bis.close(); fis.close(); br.close(); isr.close(); is.close(); sk.close(); ss.close(); } }
客户端:
package com.zking.test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.util.Scanner; /** * 手机应用市场客户端(手机) * @author Administrator * */ public class FileClientTest { public static void main(String[] args) throws Exception{ System.out.println("----------------APP客户端-----------------"); //开启一个应用市场APP程序 客户端 Socket sk = new Socket("127.0.0.1", 9999); System.out.println("客户端成功链接"); //下载LOL.txt Scanner sc = new Scanner(System.in); System.out.println("请输入您要下载程序的路径"); String path = sc.next();//D:\\lol.txt //可以通过套接字Socket中的网络流将程序的路径发送给服务器中 OutputStream os = sk.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); bw.write(path); bw.newLine(); bw.flush(); //读取出来 然后下载到某个路径即可。 //获取Socket中的网络字节输入流 InputStream is = sk.getInputStream(); //输入流转换成缓冲输入流 BufferedInputStream bis =new BufferedInputStream(is); System.out.println("请您选择保存的地址: "); String str = sc.next(); File file = new File(str); //写 FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos); //边读边写 int len = 0; while(-1!=(len = bis.read())) { bos.write(len); bos.flush(); } System.out.println("下载成功"); bos.close(); fos.close(); bis.close(); is.close(); bw.close(); osw.close(); os.close(); sk.close(); sc.close(); } }
三、窗体版:聊天(服务器&客户端)
服务端:
package com.zking.test; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * QQ服务器端 * @author Administrator * */ public class QQServerTest extends JFrame{ private ServerSocket ss = null; private Socket sk = null; private JPanel jpa = new JPanel(); private JLabel jla = new JLabel("端口号"); private JTextField jtfa = new JTextField(8); private JButton jba = new JButton("启动服务器"); private JTextArea jta = new JTextArea(); private JScrollPane jsp = new JScrollPane(jta); private JPanel jpb = new JPanel(); private JTextField jtfb = new JTextField(15); private JButton jbb = new JButton("发送"); private JButton jbc = new JButton("接收"); public QQServerTest() { this.setTitle("QQ服务器端"); this.setSize(400, 500); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); jpa.add(jla); jpa.add(jtfa); jpa.add(jba); jtfa.setText(8989+""); jta.setFont(new Font("宋体", Font.BOLD, 18)); jta.setEditable(false); jpb.add(jtfb); jpb.add(jbb); jpb.add(jbc); this.getContentPane().add(jpa,"North"); this.getContentPane().add(jsp,"Center"); this.getContentPane().add(jpb,"South"); /** * 启动服务的点击事件jba */ jba.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取端口号 String dk = jtfa.getText(); Integer port = Integer.valueOf(dk); //append jta.append("服务器正在启动中....\n"); try { //开启服务器 ServerSocket ss = new ServerSocket(port); jta.append("服务器启动成功...等待客户端链接....\n"); } catch (Exception e2) { e2.printStackTrace(); } //利用明天的知识——多线程(小弟) new Thread() { public void run() { while(true) { try { sk = ss.accept(); } catch (IOException e) { e.printStackTrace(); } jta.append("某客户端上线了....\n"); } }; }.start(); //实现自动接收数据--只要在服务器启动的那一刻,拿取一个线程(小弟弟)自动帮我接收数据并显示。 new Thread() { public void run() { while(true) { //让小弟先休息一下 try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (sk != null) { try { InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String content = br.readLine(); jta.append("客户端说: " + content + "\n"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }; }.start(); } }); /** * 服务器端回复消息给客户端 jbb */ jbb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //获取发送的内容 String content = jtfb.getText(); //客户端中获取网络输出流 利用Socket if(sk!=null) { //获取网络流 try { OutputStream os = sk.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); //写入 bw.write(content); bw.newLine(); bw.flush(); jta.append("我说:"+content); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else { JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息"); } } }); /** * 服务器端接受客户端发送的内容 jbb */ jbc.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (sk != null) { try { InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String content = br.readLine(); jta.append("客户端说: " + content + "\n"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }); this.setVisible(true); } public static void main(String[] args) { new QQServerTest(); } }
客户端:
package com.zking.test; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * QQ客户端 * * @author Administrator * */ public class QQClientTest extends JFrame { // 定义一个Socket套接字 private Socket sk = null; private JPanel jpa = new JPanel(); private JLabel jla = new JLabel("IP地址"); private JTextField jtfa = new JTextField(12); private JLabel jlb = new JLabel("端口号"); private JTextField jtfb = new JTextField(8); private JButton jba = new JButton("链接服务器"); private JTextArea jta = new JTextArea(); private JScrollPane jsp = new JScrollPane(jta); private JPanel jpb = new JPanel(); private JTextField jtfc = new JTextField(15); private JButton jbb = new JButton("发送"); private JButton jbc = new JButton("接收"); public QQClientTest() { this.setTitle("QQ客户端"); this.setSize(500, 500); this.setDefaultCloseOperation(3); this.setLocationRelativeTo(null); jpa.add(jla); jpa.add(jtfa); jpa.add(jlb); jpa.add(jtfb); jpa.add(jba); jpb.add(jtfc); jpb.add(jbb); jpb.add(jbc); this.getContentPane().add(jpa, "North"); this.getContentPane().add(jsp, "Center"); this.getContentPane().add(jpb, "South"); /** * 客户端的jba点击事件 */ jba.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String ip = jtfa.getText(); int port = Integer.valueOf(jtfb.getText()); jta.append("客户端即将来连接服务器\n"); // try { sk = new Socket(ip, port); jta.append("链接服务器成功了....\n"); } catch (Exception e2) { e2.printStackTrace(); } //开启一个多线程实现自动接收数据 new Thread() { public void run() { while(true) { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (sk != null) { try { InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String content = br.readLine(); jta.append("服务器说: " + content + "\n"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }; }.start(); } }); /** * 客户端的发送按钮jbb */ jbb.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 获取发送的内容 String content = jtfc.getText(); // 客户端中获取网络输出流 利用Socket if (sk != null) { // 获取网络流 try { OutputStream os = sk.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os); BufferedWriter bw = new BufferedWriter(osw); // 写入 bw.write(content); bw.newLine(); bw.flush(); jta.append("我:" + content+"\n"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { JOptionPane.showMessageDialog(null, "客户端没有链接服务器,不能发送消息"); } } }); /** * 客户端接收服务器端回复的消息 */ jbc.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (sk != null) { try { InputStream is = sk.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String content = br.readLine(); jta.append("服务器说: " + content + "\n"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }); this.setVisible(true); } public static void main(String[] args) { new QQClientTest(); } }