加深一下自己对于socket的理解和应用,今天写了一个demo利用socket进行C/S的相互通信。
下面贴代码:
服务器端(eclipse+tomcat+java构建)
通信服务类,继承Thread
public class ChatServer extends Thread {
private ServerSocket serverSocket=null;
private final static int PORT=5000;
private BufferedWriter bufferedWriter;
private BufferedReader bufferedReader;
private int i=0;
ChatServer() throws IOException{
serverSocket=new ServerSocket(PORT,100);
}
@Override
public void run() {;
java.net.Socket client;
//定义接收到的文本
String txt;
while (true) {
//等待客户端连接
try {
client=serverSocket.accept();
//响应客户端连接
while (true) {
bufferedReader=new BufferedReader(new InputStreamReader(client.getInputStream()));
String line="";
StringBuilder sb=new StringBuilder();
if ((line=bufferedReader.readLine())!=null) {
sb.append(line);
}
System.out.println("得到客户端数据:"+sb.toString());
//发送返回客户端的消息
String sendmsg="得到服务器端数据:"+(i++);
SendMessage(client,sendmsg);
//中断,继续等待连接请求
if (true) {
break;
}
}
//关闭连接
bufferedWriter.close();
bufferedReader.close();
client.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void SendMessage(java.net.Socket socket,String msString) throws IOException {
//获得输出流
bufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//写进数据
bufferedWriter.write(msString+"\n");
bufferedWriter.flush();
}
}
接下来是主方法:
public static void main(String[] args) throws IOException {
ChatServer chatServer=new ChatServer();
if (chatServer!=null) {
//启动线程
System.out.println("启动服务器端:");
chatServer.start();
}
服务器运行成功则如下
接下来是客户端(android studio构建)
客户端服务类:
public class ClientServer {
private Socket socket;
private BufferedReader bufferedReader=null;
private BufferedWriter bufferedWriter=null;
protected ClientServer() throws IOException {
socket=new Socket(“10.16.224.147”,5000);
}
protected void sendMsg(String msg) throws IOException {
bufferedWriter=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bufferedWriter.write(msg+”\n”);
bufferedWriter.flush();
}
protected String receiveMsg() throws IOException {
bufferedReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
StringBuilder sb=new StringBuilder();
String line="";
if ((line=bufferedReader.readLine())!=null){
sb.append(line);
}
return sb.toString();
}
}
主活动:
public class MainActivity extends AppCompatActivity {
private TextView textViewreceive;
private Button button;
private EditText edit;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==1){
edit.setText(“”);
textViewreceive.setText(msg.obj.toString());
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewreceive= (TextView) findViewById(R.id.receive);
edit= (EditText) findViewById(R.id.edit);
button= (Button) findViewById(R.id.send);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
try {
ClientServer clientServer = new ClientServer();
clientServer.sendMsg(edit.getText().toString());
String receive=clientServer.receiveMsg();
Message message=new Message();
message.what=1;
message.obj=receive;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
});
}
}
由于布局的代码比较简单,我就不贴出来了,记得加上联网的权限。下面是运行结果:
发送消息
客户端接收到服务器端消息:
服务器端接受的客户端消息:
由于我发了两次,所以服务器端收到了两次的消息,看起来还是比较简单的,只要认真学习了socket之间的通信,还是很好捣鼓出来的~