Javaのソケット通信のサンプルです。
目次
サンプル | ソケット通信とは |
サンプルコードの説明 | |
サーバー側のコード | |
クライアント側のコード | |
実行して確認する |
ソケット通信とは
- IPアドレスとポート番号で通信します
- サーバー側は待ち状態で起動します
- クライアント側はサーバー側に接続しに行きます
- サーバー側はクライアント側から要求を受けて処理をします
サンプルコードの説明
サーバー側とクライアント側のコードがあります。
クライアント側で、
偶数の数値を入力するとサーバーは「OK」を返します。
奇数の数値を入力するとサーバーは「NG」を返します。
数値以外を入力するとメッセージを返します。
byeと入力するとサーバー側とクライアント側の処理が終了します。
サーバー側のコード
ファイル名はTest1.javaです。
package test1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* ソケット通信(サーバー側)
*/
class Sample1 {
void runSample() {
ServerSocket sSocket = null;
Socket socket = null;
BufferedReader reader = null;
PrintWriter writer = null;
try{
//IPアドレスとポート番号を指定してサーバー側のソケットを作成
sSocket = new ServerSocket();
sSocket.bind(new InetSocketAddress
("127.0.0.1",8765));
System.out.println("クライアントからの入力待ち状態");
//クライアントからの要求を待ち続けます
socket = sSocket.accept();
//クライアントからの受取用
reader = new BufferedReader(
new InputStreamReader
(socket.getInputStream()));
//サーバーからクライアントへの送信用
writer = new PrintWriter(
socket.getOutputStream(), true);
//無限ループ byeの入力でループを抜ける
String line = null;
int num;
while (true) {
line = reader.readLine();
if (line.equals("bye")) {
break;
}
try{
num = Integer.parseInt(line);
if(num%2==0){
//送信用の文字を送信
writer.println("OK");
}else{
//送信用の文字を送信
writer.println("NG");
}
}catch(NumberFormatException e){
//送信用の文字を送信
writer.println("数値を入力して下さい");
}
System.out.println("クライアントで入力された文字=" + line);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
if (reader!=null){
reader.close();
}
if (writer!=null){
writer.close();
}
if (socket!=null){
socket.close();
}
if (sSocket!=null){
sSocket.close();
}
System.out.println("サーバー側終了です");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Test1 {
public static void main(String[] args) {
Sample1 s1 = new Sample1();
s1.runSample();
}
}
クライアント側のコード
ファイル名はTest2.javaです。
package test1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* ソケット通信(クライアント側)
*/
class Sample2 {
void runSample() {
Socket cSocket = null;
BufferedReader csInput = null;
PrintWriter writer = null;
BufferedReader reader = null;
try{
//IPアドレスとポート番号を指定してクライアント側のソケットを作成
cSocket = new Socket("127.0.0.1", 8765);
//クライアント側での入力用
csInput = new BufferedReader
(new InputStreamReader(System.in));
//クライアント側からサーバへの送信用
writer = new PrintWriter
(cSocket.getOutputStream(), true);
//サーバ側からの受取用
reader = new BufferedReader
(new InputStreamReader
(cSocket.getInputStream()));
//無限ループ byeの入力でループを抜ける
String line = null;
while (true) {
System.out.println("-------------------");
System.out.println("偶数の数値を入力して下さい");
System.out.println("-------------------");
line = csInput.readLine();
//送信用の文字を送信
writer.println(line);
//byeの入力でループを抜ける
if (line.equals("bye")) {
break;
}
//サーバ側からの受取の結果を表示
System.out.println
("サーバーからの回答:" + reader.readLine());
}
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (reader != null) {
reader.close();
}
if (writer != null) {
writer.close();
}
if (csInput != null) {
csInput.close();
}
if (cSocket != null) {
cSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("クライアント側終了です");
}
}
}
public class Test2 {
public static void main(String[] args) {
Sample2 s2 = new Sample2();
s2.runSample();
}
}
実行して確認する
1.コマンドプロンプトでソースコードをコンパイルします。
例:ソースコードをDドライブのtest1フォルダ配下にTest1.javaとTest2.javaを配置した場合
D:¥>javac /test1/Test1.java
D:¥>javac /test1/Test2.java
2.コマンドプロンプトを2つ立ち上げ、先にサーバー側のTest1をjavaコマンドで実行し、次にクライアント側のTest2をjavaコマンドで実行します。
D:¥>java test1.Test1
D:¥>java test1.Test2
3.以下はクライアント側での実行結果です
以下はサーバー側の実行結果です。
関連の記事
Java HTTP通信のサンプル(HttpURLConnection)
Java HTTP通信のサンプル(HttpClient)