Socket实现刷新好友

//这个是服务端的代码,一定要注意这个协议发送协议。

package com.ryan.main;


import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;


import com.ryan.client.ClientThread;


public class MyMain {
    ServerSocket serverSocket;
    List<ClientThread> list = new ArrayList<ClientThread>();
    public void startServer(){
        try {
            //创建服务器套接字
            serverSocket = new ServerSocket(9001);
            System.out.println("服务器已创建...");
            //通过线程不断获取连接
            Thread thread = new Thread(){
                public void run() {
                    while(true){
                        try {
                            System.out.println("准备接收客户端的连接信号..");
                            //该方法为阻塞方法  A链接成功
                            Socket clientSocket = serverSocket.accept();//等待客户端的连接
                            System.out.println(clientSocket.getInetAddress().getHostAddress()+"已连接...");
                            //将数据写出去
                            PrintWriter pw = new PrintWriter(clientSocket.getOutputStream());
                            for(int i=0;i<list.size();i++){
                                //将别人的上线信息告诉给自己
                                pw.write("refresh@"+list.get(i).ip_address+"@"+list.get(i).post);
                                pw.flush();
                                //通知别人,我已经上线
                                list.get(i).pw.write("refresh@"+clientSocket.getInetAddress().getHostAddress()+"@"+clientSocket.getPort());
                                list.get(i).pw.flush();
                            }
                            //通过List把客户端的连接全部包装
                            list.add(new ClientThread(clientSocket));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                };
            };
            thread.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void main(String []args){
        MyMain main = new MyMain();
        main.startServer();
    }
}
---------------------------------------我是华丽的分割线--------------------------------------
package com.ryan.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class ClientThread extends Thread {
   InputStream is;
   OutputStream os;
   public BufferedReader br;
   public PrintWriter pw;
   public String ip_address;
   public int post;
    //通过构造方法,获取客服端连接,并进行操作
   public ClientThread(Socket socket){
      try {
         //获得主机名
         ip_address = socket.getInetAddress().getHostAddress();
         post = socket.getPort();
         is = socket.getInputStream();
         os = socket.getOutputStream();
            //获得输入流
         br = new BufferedReader(new InputStreamReader(is));
            //获得输出流
         pw = new PrintWriter(os);
         
         
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   @Override
   public void run() {
      
      super.run();
   }
}
---------------------------------------我是华丽的分割线--------------------------------------
//下面是客服端代码。

package com.ryan.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class ClientThread extends Thread {
    //服务端IP地址
    private static String IP_ADDRESS = "192.168.253.28";
    //端口号
    private static int POST = 9001;
    //将这个类写成单列模式。
    static ClientThread clientThread;
    static Socket clientSocket;
    PrintWriter pw;
    BufferedReader br;
    public ClientThread(){

    }
    //单列模式写法的一种
    public static ClientThread getInstance(){
        if(clientThread==null){
            clientThread = new ClientThread();
            clientThread.start();
        }
        return clientThread;
    }
    //RUN方法下进行初始化操作
    public void init(){
        try {
            //通过IP与端口通过Socket建立连接
            clientSocket = new Socket(IP_ADDRESS, POST);
            //获取输出流与输入流。记住,写出去可以一次写写出去。读进来必须是通过字符流或者字节流 缓冲流。
            pw = new PrintWriter(clientSocket.getOutputStream());
            br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        //RUN方法下进行初始化操作
        init();
        try {
            while(true){
                //获取服务端的数据
                String msg = br.readLine();
                //将服务端是数据分割。分别获得如下数据
                String [] msgs = msg.split("@");
                String protocol = msgs[0];
                String ip = msgs[1];
                String post = msgs[2];
                //进行必要的判断
                if(protocol.equals("refresh")){
                    System.out.println("您有好友上线,ip"+ip+":"+post);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        super.run();
    }

}

package com.ryan.lsn4_24_client;


import com.ryan.client.ClientThread;


import android.os.Bundle;
import android.app.Activity;


public class MainActivity extends Activity {
	ClientThread clientThread;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
	public void init(){
		clientThread = ClientThread.getInstance();
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值