程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Socket聊天室編程(一)之應用socket完成聊天之新聞推送

Java Socket聊天室編程(一)之應用socket完成聊天之新聞推送

編輯:關於JAVA

Java Socket聊天室編程(一)之應用socket完成聊天之新聞推送。本站提示廣大學習愛好者:(Java Socket聊天室編程(一)之應用socket完成聊天之新聞推送)文章只能為提供參考,不一定能成為您想要的結果。以下是Java Socket聊天室編程(一)之應用socket完成聊天之新聞推送正文


相干浏覽:Java Socket聊天室編程(二)之應用socket完成單聊聊天室

網上曾經有許多應用socket完成聊天的例子了,然則我看過許多,多若干有一些成績存在。

這裡我將完成一個比擬完全的聊天例子,並說明個中的邏輯。

因為socket這一塊比擬年夜,所以我將分出幾篇來寫一個比擬完全的socket例子。

這裡我們先來完成一個最簡略的,辦事器與客戶端通信,完成新聞推送的功效。

目標:辦事器與客戶端樹立銜接,客戶端可以向辦事器發送新聞,辦事器可以向客戶端推送新聞。

1,應用java樹立socket聊天辦事器

1,SocketUrls 肯定ip地址和端標語

public class SocketUrls{
// ip地址
public final static String IP = "192.168.1.110";
// 端標語
public final static int PORT = 8888;
}

2,Main 法式的進口

public class Main {
public static void main(String[] args) throws Exception {
new ChatServer().initServer();
}
}

3,Bean 實體類

用戶信息 UserInfoBean

public class Main {

public static void main(String[] args) throws Exception {
new ChatServer().initServer();
}
}

聊天信息 MessageBean

public class MessageBean extends UserInfoBean {
private long messageId;// 新聞id
private long groupId;// 群id
private boolean isGoup;// 能否是群新聞
private int chatType;// 新聞類型;1,文本;2,圖片;3,藐視頻;4,文件;5,地輿地位;6,語音;7,視頻通話
private String content;// 文本新聞內容
private String errorMsg;// 毛病信息
private int errorCode;// 毛病代碼
//省略get/set辦法
}

4,ChatServer 聊天辦事,最重要的法式

public class ChatServer {
// socket辦事
private static ServerSocket server;
public Gson gson = new Gson();
/**
* 初始化socket辦事
*/
public void initServer() {
try {
// 創立一個ServerSocket在端口8080監聽客戶要求
server = new ServerSocket(SocketUrls.PORT);
createMessage();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 創立新聞治理,一向吸收新聞
*/
private void createMessage() {
try {
System.out.println("期待用戶接入 : ");
// 應用accept()壅塞期待客戶要求
Socket socket = server.accept();
System.out.println("用戶接入 : " + socket.getPort());
// 開啟一個子線程來期待別的的socket參加
new Thread(new Runnable() {
public void run() {
createMessage();
}
}).start();
// 向客戶端發送信息
OutputStream output = socket.getOutputStream();
// 從客戶端獲得信息
BufferedReader bff = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// Scanner scanner = new Scanner(socket.getInputStream());
new Thread(new Runnable() {
public void run() {
try {
String buffer;
while (true) {
// 從掌握台輸出
BufferedReader strin = new BufferedReader(new InputStreamReader(System.in));
buffer = strin.readLine();
// 由於readLine以換行符為停止點所以,開頭參加換行
buffer += "\n";
output.write(buffer.getBytes("utf-8"));
// 發送數據
output.flush();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
// 讀取發來辦事器信息
String line = null;
// 輪回一向吸收以後socket發來的新聞
while (true) {
Thread.sleep(500);
// System.out.println("內容 : " + bff.readLine());
// 獲得客戶真個信息
while ((line = bff.readLine()) != null) {
MessageBean messageBean = gson.fromJson(line, MessageBean.class);
System.out.println("用戶 : " + messageBean.getUserName());
System.out.println("內容 : " + messageBean.getContent());
}
}
// server.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("毛病 : " + e.getMessage());
}
}
}

2,Android 端作為挪動端銜接辦事器

1,appliaction 實例化一個全局的聊天辦事

public class ChatAppliaction extends Application {
public static ChatServer chatServer;
public static UserInfoBean userInfoBean;
@Override
public void onCreate() {
super.onCreate();
}
}

2,ip地址和端標語和辦事器堅持分歧

3,聊天實力類同辦事器端一樣

4,xml結構。上岸,聊天

1,登錄

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/chat_name_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用戶名"
android:text="admin"/>
<EditText
android:id="@+id/chat_pwd_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="暗碼"
android:text="123123123a"
android:inputType="numberPassword" />
<Button
android:id="@+id/chat_login_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="登錄" />
</LinearLayout>

2,聊天

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".activity.MainActivity">
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.9">
<LinearLayout
android:id="@+id/chat_ly"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/chat_et"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.8" />
<Button
android:id="@+id/send_btn"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.2"
android:text="發送" />
</LinearLayout>
</LinearLayout>

5,LoginActivity 上岸

public class LoginActivity extends AppCompatActivity {
private EditText chat_name_text, chat_pwd_text;
private Button chat_login_btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
chat_name_text = (EditText) findViewById(R.id.chat_name_text);
chat_pwd_text = (EditText) findViewById(R.id.chat_pwd_text);
chat_login_btn = (Button) findViewById(R.id.chat_login_btn);
chat_login_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getLogin(chat_name_text.getText().toString().trim(), chat_pwd_text.getText().toString().trim())) {
getChatServer();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
}
});
}
private boolean getLogin(String name, String pwd) {
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(pwd)) return false;
if (name.equals("admin") && pwd.equals("123123123a")) return true;
return false;
}
private void getChatServer() {
ChatAppliaction.chatServer = new ChatServer();
}
}

6,MainActivity 聊天

public class MainActivity extends AppCompatActivity {
private LinearLayout chat_ly;
private TextView left_text, right_view;
private EditText chat_et;
private Button send_btn;
private ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chat_ly = (LinearLayout) findViewById(R.id.chat_ly);
chat_et = (EditText) findViewById(R.id.chat_et);
send_btn = (Button) findViewById(R.id.send_btn);
send_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ChatAppliaction.chatServer.sendMessage(chat_et.getText().toString().trim());
chat_ly.addView(initRightView(chat_et.getText().toString().trim()));
}
});
//添加新聞吸收隊列
ChatAppliaction.chatServer.setChatHandler(new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
//發送回來新聞後,更新ui
chat_ly.addView(initLeftView(msg.obj.toString()));
}
}
});
}
/**靠右的新聞
* @param messageContent
* @return
*/
private View initRightView(String messageContent) {
right_view = new TextView(this);
right_view.setLayoutParams(layoutParams);
right_view.setGravity(View.FOCUS_RIGHT);
right_view.setText(messageContent);
return right_view;
}
/**靠左的新聞
* @param messageContent
* @return
*/
private View initLeftView(String messageContent) {
left_text = new TextView(this);
left_text.setLayoutParams(layoutParams);
left_text.setGravity(View.FOCUS_LEFT);
left_text.setText(messageContent);
return left_text;
}
}

7,ChatServer 聊天邏輯,最重要的

public class ChatServer {
private Socket socket;
private Handler handler;
private MessageBean messageBean;
private Gson gson = new Gson();
// 由Socket對象獲得輸入流,並結構PrintWriter對象
PrintWriter printWriter;
InputStream input;
OutputStream output;
DataOutputStream dataOutputStream;
public ChatServer() {
initMessage();
initChatServer();
}
/**
* 新聞隊列,用於傳遞新聞
*
* @param handler
*/
public void setChatHandler(Handler handler) {
this.handler = handler;
}
private void initChatServer() {
//開個線程吸收新聞
receiveMessage();
}
/**
* 初始化用戶信息
*/
private void initMessage() {
messageBean = new MessageBean();
messageBean.setUserId(1);
messageBean.setMessageId(1);
messageBean.setChatType(1);
messageBean.setUserName("admin");
ChatAppliaction.userInfoBean = messageBean;
}
/**
* 發送新聞
*
* @param contentMsg
*/
public void sendMessage(String contentMsg) {
try {
if (socket == null) {
Message message = handler.obtainMessage();
message.what = 1;
message.obj = "辦事器曾經封閉";
handler.sendMessage(message);
return;
}
byte[] str = contentMsg.getBytes("utf-8");//將內容轉utf-8
String aaa = new String(str);
messageBean.setContent(aaa);
String messageJson = gson.toJson(messageBean);
/**
* 由於辦事器那裡的readLine()為壅塞讀取
* 假如它讀取不到換行符或許輸入流停止就會一向壅塞在那邊
* 所以在json新聞最初加上換行符,用於告知辦事器,新聞曾經發送終了了
* */
messageJson += "\n";
output.write(messageJson.getBytes("utf-8"));// 換行打印
output.flush(); // 刷新輸入流,使Server立時收到該字符串
} catch (Exception e) {
e.printStackTrace();
Log.e("test", "毛病:" + e.toString());
}
}
/**
* 吸收新聞,在子線程中
*/
private void receiveMessage() {
new Thread(new Runnable() {
@Override
public void run() {
try {
// 向本機的8080端口收回客戶要求
socket = new Socket(SocketUrls.IP, SocketUrls.PORT);
// 由Socket對象獲得輸出流,並結構響應的BufferedReader對象
printWriter = new PrintWriter(socket.getOutputStream());
input = socket.getInputStream();
output = socket.getOutputStream();
dataOutputStream = new DataOutputStream(socket.getOutputStream());
// 從客戶端獲得信息
BufferedReader bff = new BufferedReader(new InputStreamReader(input));
// 讀取發來辦事器信息
String line;
while (true) {
Thread.sleep(500);
// 獲得客戶真個信息
while ((line = bff.readLine()) != null) {
Log.i("socket", "內容 : " + line);
Message message = handler.obtainMessage();
message.obj = line;
message.what = 1;
handler.sendMessage(message);
}
if (socket == null)
break;
}
output.close();//封閉Socket輸入流
input.close();//封閉Socket輸出流
socket.close();//封閉Socket
} catch (Exception e) {
e.printStackTrace();
Log.e("test", "毛病:" + e.toString());
}
}
}).start();
}
}

寫到這裡,曾經完成了一切的代碼。

這個demo可以完成手機端向辦事器發送新聞,辦事器向手機端發送新聞。

這個demo可以算是推送功效,不外真實的推送沒有這麼簡略。作為一個socket的入門懂得,可以從中看到socket編程的思惟。

以上所述是小編給年夜家引見的Java Socket聊天室編程(一)之應用socket完成聊天之新聞推送,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved