Live Brilliant

JAVA Socket Programming 본문

개발은 핵찜이야/Java

JAVA Socket Programming

주인정 2012. 4. 17. 19:58
1단계. 서버와 클라이언트

프로그램은 다음과 같은 순서로 작동을 하게 됩니다.
  1. 서버가 소켓을 생성하고 연결을 기다린다.
  2. 클라이언트에서 서버의 소켓에 연결한다.
  3. 클라이언트에서 데이터를 전송한다.
  4. 서버에서 데이터를 받아서 화면에 출력한다.
  5. 서버와 클라이언트의 소켓 연결을 끊는다.

서버

이클립스에서 TCPtest 자바프로젝트 만든후
TCPserver.java 클래스 생성

TCPserver.java

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

public class TCPserver implements Runnable {
public static final int ServerPort = 4444;
public static final String ServerIP = "192.168.0.35";
@Override
public void run() {
// TODO Auto-generated method stub
try{
System.out.println("S: Connecting...");
ServerSocket serverSocket = new ServerSocket(ServerPort);

while (true) {
//accept 연결 소켓이 만들어지고 그것을 받아들입니다. 메서드 블록 연결이 만들 때까지.
Socket client = serverSocket.accept();
// client = Socket[addr=/192.168.0.35,port=3148,localport=4444]
//System.out.println(client);
System.out.println("S: Receiving...");

try {
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("S: Received: '" + str + "'");

// 기본 문자 인코딩을 사용하는 OutputStreamWriter를 생성합니다.
// getOutputStream = 이 소켓에 대한 반환 출력 스트림
// PrintWriter객체를 생성할때 Autoflush 아규먼트를 가지는 생성자가 있더라..
// 아래와 같이 생성하면 out.println() 혹은 out.print() 메소드 호출시 버퍼에서
// 해당 outputstream 혹은 Writer으로 뱉어내준다.

PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);
out.println("Server Received "+ str);
} catch(Exception e) {
System.out.println("S: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("S: Done.");
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread desktopServerThread = new Thread(new TCPserver());
desktopServerThread.start();
}
}

------------------------------------------------------------------
클라이언트

TCPsocketTest Android 프로젝트 만든후
TCPsoketTest.java 클래스 생성

TCPsocketTest.java
package com.android.TCPsoketTest;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class TCPsoketTest extends Activity {
/** Called when the activity is first created. */
private String return_msg;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText et = (EditText)findViewById(R.id.EditText01);
Button btn = (Button)findViewById(R.id.Button01);
final TextView tv = (TextView)findViewById(R.id.TextView01);
btn.setOnClickListener(new OnClickListener(){
public void onClick(View v){
if(et.getText().toString() != null || !et.getText().toString().equals("")){
TCPclient tp = new TCPclient(et.getText().toString());
tp.run();
Toast t = Toast.makeText(getApplicationContext(), return_msg, Toast.LENGTH_LONG);
t.show();
tv.setText(return_msg);
}
}
});
}
private class TCPclient implements Runnable {
private static final String serverIP = "192.168.0.35";
private static final int serverPort = 4444;
private String msg;
//private String return_msg;
public TCPclient(String _msg){
this.msg = _msg;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
InetAddress serverAddr = InetAddress.getByName(serverIP);
Log.d("TCP", "C: Connecting...");
Socket socket = new Socket(serverAddr, serverPort);
try {
Log.d("TCP", "C: Sending: '" + msg + "'");
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
out.println(msg);
Log.d("TCP", "C: Sent.");
Log.d("TCP", "C: Done.");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
return_msg = in.readLine();
Log.d("TCP", "C: Server send to me this message -->" + return_msg);
} catch(Exception e) {
Log.e("TCP", "C: Error1", e);
} finally {
socket.close();
}
} catch (Exception e) {
Log.e("TCP", "C: Error2", e);
}
}
}
}

---------------------------------------------------------------------------
main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id="@+id/TextView01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<EditText android:id="@+id/EditText01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"/>
<Button android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send"/>
</LinearLayout>
--------------------------------------------------------------------------
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.TCPsoketTest"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".TCPsoketTest"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />
//인터넷 사용 퍼미션이 필요하다.
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

 

'개발은 핵찜이야 > Java' 카테고리의 다른 글

자바 날짜/시간 계산 예제 코드 모음  (0) 2012.04.17
자바 형변환 모음  (0) 2012.04.17
TCP_Socket 통신  (0) 2012.04.17
java + jdbc mysql 연동  (0) 2012.04.17
Comments