//这个是服务端的代码,一定要注意这个协议发送协议。
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();
}