看了别人的代码,然后按照自己的理解写了一个,可以运行,和大家分享~
觉得socket不难,多看多做才是提高的方式。
以下是代码:
服务端:
package lance.socket_2;
import java.io.*;
import java.net.*;
//练习一下而已
public class ServerTest {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(965);
while (true) {// 在这里一直接收
Socket s_socket = server.accept();// 得到服务端的socket
invoke(s_socket);// 放到一个线程里面去跑
}
}
public static void invoke(final Socket s_socket) {
// new Thread(Runnable接口的实例).start();
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader br = null;
PrintWriter pw = null;
try {
br = new BufferedReader(new InputStreamReader(
s_socket.getInputStream()));
pw = new PrintWriter(new OutputStreamWriter(
s_socket.getOutputStream()), true);// 写一句回去的时候用,true 是为了即时刷新
String msg = "";
while (msg.equals("bye") == false) {
msg = br.readLine();// 获得一个消息
System.out.println("来自客户端:" + msg);
// 给客户端返回一条消息
pw.println("来自服务端:已经收到你的消息→"+msg);
pw.flush();
}
// 关闭一下,socket也要关闭一下
br.close();
pw.close();
s_socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
客户端:
package lance.socket_2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientTest {
public static void main(String[] argsStrings) throws UnknownHostException,
IOException {
Socket socket = new Socket("localhost", 965);
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
BufferedReader input = new BufferedReader(new InputStreamReader(
System.in));
String msg = "";//不可以设置为null否则出错
while (msg.equals("bye") == false) {
msg = input.readLine();// 输入一个信息
pw.println(msg);// 通过socket发送过去
pw.flush();
System.out.println(br.readLine());// 读取服务端的反馈信息
}
//好孩子关闭一下
br.close();
pw.close();
socket.close();
}
}
·收到bye之后,服务器就停止了。
·注意可能出现端口被占用的情况。
·String不能是null,使用equals方法就会出现空指针异常。