activity_main.xml
<?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:background="@drawable/hhh"
android:orientation="vertical">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#318A9898">
<TextView
android:id="@+id/tv_room"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="登录聊天室"
android:textColor="#9EF6F0F0"
android:textSize="20sp" />
</androidx.appcompat.widget.Toolbar>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_gravity="center_vertical"
android:paddingTop="120dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_name"
android:text="用户名"
android:gravity="center"
android:textSize="20sp"
android:textColor="#9EFFFFFF"/>
<EditText
android:layout_width="150dp"
android:layout_height="wrap_content"
android:id="@+id/edittext1"
android:gravity="center"
android:textColor="#fff"
android:textSize="19sp"
android:theme="@style/CretateRoomEditTextTheme"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv2_name"
android:text="IP地址"
android:gravity="center"
android:textSize="20sp"
android:textColor="#9EFFFFFF"/>
<EditText
android:layout_width="150dp"
android:layout_height="wrap_content"
android:id="@+id/edittext2"
android:gravity="center"
android:textColor="#fff"
android:textSize="19sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv3_name"
android:text="端口 "
android:gravity="center"
android:textSize="20sp"
android:textColor="#9EFFFFFF"/>
<EditText
android:layout_width="150dp"
android:layout_height="wrap_content"
android:id="@+id/edittext3"
android:gravity="center"
android:textColor="#fff"
android:textSize="19sp"
/>
</LinearLayout>
</LinearLayout>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginEnd="30dp"
android:layout_marginTop="20dp"
android:text="登 录"
android:textSize="16sp"
android:textColor="#fff"
android:background="#318A9898"/>
</LinearLayout>
 MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button button;
private EditText editText1;
private EditText editText2;
private EditText editText3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
editText1 = findViewById(R.id.edittext1);
editText2 = findViewById(R.id.edittext2);
editText3 = findViewById(R.id.edittext3);
button.setOnClickListener(MainActivity.this);
editText2.setText("192.168.1.200");
editText3.setText("9999");
}
@Override
public void onClick(View view) {
String name = editText1.getText().toString();
if("".equals(name)) {
Toast.makeText(this, "请输入用户名", Toast.LENGTH_SHORT).show();
}else {
Intent intent = new Intent(MainActivity.this, ChatRoom.class);
intent.putExtra("name", editText1.getText().toString());
intent.putExtra("ip", editText2.getText().toString());
intent.putExtra("port",editText3.getText().toString());
startActivity(intent);
}
}
}
activity_chat_room
<?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"
android:background="@drawable/qqq">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/toolbar2"
android:background="#579BA5A5">
<Button
android:layout_width="45dp"
android:layout_height="45dp"
android:id="@+id/back"
android:background="@drawable/f"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/chat_room"
android:text="ChatRoom"
android:layout_gravity="center"
android:textSize="20sp"/>
</androidx.appcompat.widget.Toolbar>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/msg_recyclerview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/input_text"
android:hint="Type Something..."
android:maxLines="2"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/send"
android:text="Send"
android:textAllCaps="false"
android:textSize="18sp"
android:background="#579BA5A5"/>
</LinearLayout>
</LinearLayout>
 Msg
public class Msg {
public static final int TYPE_RECEIVED = 0;
public static final int TYPE_SEND = 1;
private String content;
private int type;
private String data;
private String name;
public Msg(String content, int type, String name, String data) {
this.content = content;
this.type = type;
this.name = name;
this.data = data;
}
public String getContent() {
return content;
}
public int getType() {
return type;
}
public String getData() {
return data;
}
public String getName() {
return name;
}
}
MsgAdapter
public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {
private List<Msg> list;
public MsgAdapter(List<Msg> list1) {
list = list1;
}
static class ViewHolder extends RecyclerView.ViewHolder {
LinearLayout leftLinearLayout;
LinearLayout rightLinearLayout;
TextView item_data;
TextView item_leftname;
TextView item_rightname;
TextView item_leftcontent;
TextView item_rightcontent;
public ViewHolder(View itemView) {
super(itemView);
leftLinearLayout = (LinearLayout) itemView.findViewById(R.id.item_leftLinearLayout);
rightLinearLayout = (LinearLayout) itemView.findViewById(R.id.item_rightLinearLayout);
item_data = (TextView) itemView.findViewById(R.id.item_data);
item_leftname = (TextView) itemView.findViewById(R.id.item_leftname);
item_rightname = (TextView) itemView.findViewById(R.id.item_rightname);
item_leftcontent = (TextView) itemView.findViewById(R.id.item_leftcontent);
item_rightcontent = (TextView) itemView.findViewById(R.id.item_rightcontent);
}
}
@Override
public MsgAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item, parent, false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MsgAdapter.ViewHolder holder, int position) {
Msg msg = list.get(position);
if(msg.getType() == msg.TYPE_RECEIVED) {
holder.leftLinearLayout.setVisibility(View.VISIBLE);
holder.rightLinearLayout.setVisibility(View.GONE);
holder.item_data.setText(msg.getData());
holder.item_leftcontent.setText(msg.getContent());
holder.item_leftname.setText(msg.getName());
}else if(msg.getType() == Msg.TYPE_SEND) {
holder.leftLinearLayout.setVisibility(View.GONE);
holder.rightLinearLayout.setVisibility(View.VISIBLE);
holder.item_data.setText(msg.getData());
holder.item_rightcontent.setText(msg.getContent());
holder.item_rightname.setText(msg.getName());
}
}
@Override
public int getItemCount() {
return list.size();
}
}
ChatRoom
public class ChatRoom extends AppCompatActivity implements View.OnClickListener{
private List<Msg> list = new ArrayList<>();
private String name;
private String ip;
private String port;
private Button send;
private Button back;
private EditText inputview;
private RecyclerView recyclerView;
private MsgAdapter adapter;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
private Socket socket;
private boolean Istrue = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_room);
Intent intent = getIntent();
name = intent.getStringExtra("name");
ip = intent.getStringExtra("ip");
port = intent.getStringExtra("port");
inputview = findViewById(R.id.input_text);
send = findViewById(R.id.send);
send.setOnClickListener(this);
back = findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(ChatRoom.this);
alertDialog.setTitle("退出");
alertDialog.setMessage("退出登录?");
alertDialog.setCancelable(false);
alertDialog.setPositiveButton("是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
finish();
}
});
alertDialog.setNegativeButton("否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
alertDialog.show();
}
});
recyclerView = (RecyclerView) findViewById(R.id.msg_recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
adapter = new MsgAdapter(list);
recyclerView.setAdapter(adapter);
new Thread(new Runnable() {
@Override
public void run() {
try {
if("9999".equals(port) && "192.168.1.200".equals(ip)) {
socket = new Socket(ip, Integer.parseInt(port));
Istrue = true;
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
new Thread(new Revised()).start();
}else {
Looper.prepare();
Toast.makeText(ChatRoom.this, "连接服务器失败", Toast.LENGTH_SHORT).show();
Looper.loop();
socket = new Socket(ip, Integer.parseInt(port));
dataInputStream = new DataInputStream(socket.getInputStream());
dataOutputStream = new DataOutputStream(socket.getOutputStream());
new Thread(new Revised()).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
private void AutoDelete() {
while(list.size() > 20) {
list.remove(0);
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
}
}
class Revised implements Runnable{
@Override
public void run() {
while(true) {
String content = null;
String name = null;
char[] arr = null;
int len = 0;
char c = 0;
try{
arr = new char[200];
while(((c = dataInputStream.readChar()) != '\t')) {
arr[len] = c;
len++;
}
content = new String(arr, 0 , len);
System.out.println(content);
len = 0;
while(((c = dataInputStream.readChar()) != '\t')) {
arr[len] = c;
len++;
}
name = new String(arr, 0 , len);
System.out.println(name);
}catch (IOException e) {
e.printStackTrace();
}
String data = getdata();
Msg msg = new Msg(content, Msg.TYPE_RECEIVED, name, data);
list.add(msg);
AutoDelete();
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
}
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.send:
final String content = inputview.getText().toString();
String data = getdata();
if(!"".equals(inputview.getText().toString())) {
if(Istrue) {
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(dataOutputStream);
System.out.println(content);
System.out.println(name);
dataOutputStream.writeChars(content);
dataOutputStream.writeChar('\t');
dataOutputStream.writeChars(name);
dataOutputStream.writeChar('\t');
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}else {
Toast.makeText(ChatRoom.this, "发送失败", Toast.LENGTH_SHORT).show();
}
Msg msg = new Msg(content, Msg.TYPE_SEND, name, data);
list.add(msg);
AutoDelete();
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
inputview.setText("");
}
}
}
private String getdata() {
Date data = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
return simpleDateFormat.format(data);
}
ChatServer
public class ChatServer {
private final static int port = 9999;
public static ArrayList<Socket> list;
public static void main(String[] args) {
new Thread(new startServer()).start();
}
static class startServer implements Runnable {
@Override
public void run() {
try {
ServerSocket serverSocket = new ServerSocket(port);
list = new ArrayList<>();
while (true) {
Socket socket = serverSocket.accept();
System.out.println(socket);
list.add(socket);
new send(socket, list).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class send extends Thread {
private Socket socket;
private DataInputStream dataInputStream;
private DataOutputStream dataOutputStream;
public ArrayList<Socket> list;
public send(Socket socket, ArrayList<Socket> list) {
this.socket = socket;
this.list = list;
}
@Override
public void run() {
try {
dataInputStream = new DataInputStream(socket.getInputStream());
while (true) {
String content;
String name;
char[] arr = new char[200];
int len = 0;
char c = 0;
while((c = dataInputStream.readChar()) != '\t'){
arr[len] = c;
len++;
}
content = new String(arr, 0, len);
System.out.println(content);
len = 0;
while((c = dataInputStream.readChar()) != '\t'){
arr[len] = c;
len++;
}
name = new String(arr, 0, len);
System.out.println(name);
for(Socket socket : list) {
if(socket == this.socket) {
continue;
}
dataOutputStream = new DataOutputStream(socket.getOutputStream());
try {
dataOutputStream.writeChars(content);
dataOutputStream.writeChar('\t');
dataOutputStream.writeChars(name);
dataOutputStream.writeChar('\t');
System.out.println(content);
System.out.println(name);
} catch (IOException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
|