關於socket編程【以聊天為例】

來源:互聯網
上載者:User

Android手機的應用,除了它的手機功能之外,另外一個迷人的地方在於它的開放性,這一點iphone無法比擬,至少iphone太多商業化氣息。

如同當年windows95一樣,android為我們開啟另一扇交流之窗,而要實現交流,socket通訊必不可少。

java在socket通訊方面上已經有了很好的範例,我只是拋磚引玉,將其引入到android之中,疏漏之處在所難免,很多地方也值得深思與考量,高手不必拍磚,可跳過此文。

下面,用敲門的方式示範Android如何?通訊端的通訊。

本例實現功能如下:

Server端開啟服務
Client端發起連結請求,並向Server端發送資料
Server端響應請求,並在Server顯示,向Client端返回資料
Client端接收Server的資料並顯示

終端1:

終端2:

Server端:

本例原始碼如下:

Server端:

package com.android.Yao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class YaoChatServer extends Thread {

private YaoChatServer() throws IOException {
CreateSocket();
//建立Socket伺服器
}

public void run() {
Socket client;
String txt;
try {
while (true)
//線程無限迴圈,即時監聽socket連接埠
{
client=ResponseSocket();
//響應用戶端連結請求。。

while(true)
{
txt=ReceiveMsg(client);
System.out.println(txt);
//連結獲得用戶端發來訊息,並將其顯示在Server端的螢幕上

SendMsg(client,txt);
//向用戶端返回訊息

if(true)break;
//中斷,繼續等待連結請求
}

CloseSocket(client);
//關閉此次連結
}
}
catch (IOException e) {
System.out.println(e);
}

}

private ServerSocket server = null;
private static final int PORT = 5000;
private BufferedWriter writer;
private BufferedReader reader;

private void CreateSocket() throws IOException
{
server = new ServerSocket(PORT, 100);
System.out.println("Server starting..");
}

private Socket ResponseSocket() throws IOException
{
Socket client = server.accept();
System.out.println("client connected..");

return client;
}

private void CloseSocket(Socket socket) throws IOException
{
reader.close();
writer.close();
socket.close();
System.out.println("client closed..");
}

private void SendMsg(Socket socket,String Msg) throws IOException
{
writer = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream()));
writer.write(Msg+"\n");
writer.flush();

}

private String ReceiveMsg(Socket socket) throws IOException
{
reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println("server get input from client socket..");
String txt="Sever send:"+reader.readLine();

return txt;
}

public static void main(final String args[]) throws IOException {
YaoChatServer yaochatserver = new YaoChatServer();
if (yaochatserver != null) {
yaochatserver.start();
}
}

}

Client端:

package com.android.Yao;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.net.UnknownHostException;

import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.*;

public class YaoChatRoomAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.chatroom);

findviews();
setonclick();

}

private EditText chattxt;
private TextView chattxt2;
private Button chatok;

public void findviews()
{
chattxt = (EditText)this.findViewById(R.id.chattxt);
chattxt2 = (TextView)this.findViewById(R.id.chattxt2);
chatok = (Button)this.findViewById(R.id.chatOk);
}

private void setonclick()
{
chatok.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
try {
connecttoserver(chattxt.getText().toString());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}

public void connecttoserver(String socketData) throws UnknownHostException, IOException
{
Socket socket=RequestSocket("192.168.0.107",5000);
SendMsg(socket,socketData);
String txt = ReceiveMsg(socket);
this.chattxt2.setText(txt);
}

private Socket RequestSocket(String host,int port) throws UnknownHostException, IOException
{
Socket socket = new Socket(host, port);
return socket;
}

private void SendMsg(Socket socket,String msg) throws IOException
{
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
writer.write(msg.replace("\n", " ")+"\n");
writer.flush();
}

private String ReceiveMsg(Socket socket) throws IOException
{
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String txt=reader.readLine();
return txt;

}
}

備忘:原作者有個問題沒說清楚的是:要在android使用上面的用戶端的話,必然要在AndroidManifest.xml中註冊(<uses-permission android:name="android.permission.INTERNET"/>"),也正是因為這個問題讓我糾結了好久。

來源:http://hi.baidu.com/gk14/blog/item/a25c0e463fbc1a056a63e52c.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.