都是网上找的简答的例子,实现自己想要的功能。留着以后备用。
C#:服务器端,使用的是简单地TcpListener :
static void Main(string[] args)
{
TcpListener server = null;
Console.Write("请输入监听的端口号:");
string strPort = Console.ReadLine();
try
{
int port = Convert.ToInt32(strPort);
IPEndPoint listenPort = new IPEndPoint(IPAddress.Any, port);
server = new TcpListener(listenPort);//初始化TcpListener的新实例
server.Start();//开始监听客户端的请求
Byte[] bytes = new Byte[256];//缓存读入的数据
String data = null;
while (true)//循环监听
{
Console.Write("服务已启动");
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("已连接!");
data = null;
NetworkStream stream = client.GetStream();//获取用于读取和写入的流对象
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
//将借宿字节的数据转换成一个UTF8字符串
data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
Console.WriteLine("接收消息:{0}", data);
Console.Write("发送消息:");
data = Console.ReadLine();//服务器发送消息
byte[] msg = System.Text.Encoding.UTF8.GetBytes(data);
stream.Write(msg, 0, msg.Length);
}
client.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
server.Stop();
}
Console.WriteLine("\n按任意键退出...");
}
Android端:
记得加权限:
<uses-permission android:name="android.permission.INTERNET"/>
简单的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
/>
<Button
android:id="@+id/connectBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="建立连接" />
<Button
android:id="@+id/sendBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送消息" />
</LinearLayout>
MainActivity:
public class MainActivity extends AppCompatActivity {
Button connect ;
Button send;
EditText msg;
String sendData = "";
boolean RD = false;//用于控制读数据线程是否执行
OutputStream OutputStream = null; //定义数据输出流,用于发送数据
InputStream InputStream = null; //定义数据输入流,用于接收数据
Socket Socket = null;//Socket
String TAG = "TCPtest";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
connect = findViewById(R.id.connectBtn);
send = findViewById(R.id.sendBtn);
msg = findViewById(R.id.editText);
connect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Connect_Thread Connect_thread = new Connect_Thread(); //并创建一个新的线程,用于初始化socket
Connect_thread.start();
Log.d(TAG, "连接服务器");
}
});
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendData = msg.getText().toString();
ThreadSendData t2 = new ThreadSendData(); //启动一个新的线程,用于发送数据
t2.start();
}
});
}
class Connect_Thread extends Thread //用线程创建Socket连接
{
public void run()
{
try {
if (Socket == null) //判断socket的状态,防止重复执行
{
Socket = new Socket("192.168.1.100", 2029);; //如果socket为空则执行新建一个socket
InputStream = Socket.getInputStream();//获取socket的输入流和输出流
OutputStream = Socket.getOutputStream();
ThreadReadData t1 = new ThreadReadData();//新建一个线程读数据
t1.start();
}
}
catch (Exception e) //如果有错误则在这里返回
{
e.printStackTrace();
}
}
}
class ThreadReadData extends Thread //用线程执行读取服务器发来的数据
{
public void run()
{
String textdata; //定义一个变量用于储存服务器发来的数据
while (RD) //根据RD变量的值判断是否执行读数据
{
try
{
final byte[] ReadBuffer = new byte[2048]; //定义一个字节集,存放输入的数据,缓存区大小为2048字节
final int ReadBufferLengh; //用于存放数据量
//从输入流获取服务器发来的数据和数据宽度
//ReadBuffer为参考变量,在这里会改变为数据
//输入流的返回值是服务器发来的数据宽度
ReadBufferLengh = InputStream.read(ReadBuffer);
if (ReadBufferLengh == -1) //验证数据宽度,如果为-1则已经断开了连接
{
RD = false;//重新归位到初始状态
Socket.close();
Socket = null;
Log.d(TAG, "run: 连 接 服 务 器");
} else {
//如果有数据正常返回则进行处理显示
textdata = new String(ReadBuffer,0,ReadBufferLengh,"GB2312");//原始编码数据
Log.d(TAG,new String(textdata.getBytes(),"UTF-8"));//转为UTF-8编码后显示在编辑框中
}
} catch (Exception e)
{
e.printStackTrace();
}
}
}
}
class ThreadSendData extends Thread //用线程发送数据
{
public void run()
{
try
{
OutputStream.write(sendData.getBytes()); //用输出流发送数据
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}